>

와 같은 목록에있는 요소의 합 또는 곱이 필요한 경우

>>> foo = [10, 5, 3, 4]

sum 를 사용할 수 있습니다  또는 prod  numpy의 함수

>>> import numpy as np
>>> np.sum(foo)
22
>>> np.prod(foo)
600

마찬가지로 누적 합계 나 제품이 필요할 때 np.cumsum 를 사용할 수 있습니다  또는 np.cumprod

>>> np.cumsum(foo)
array([10, 15, 18, 22])
>>> np.cumprod(foo)
array([ 10,  50, 150, 600])

임의 reduce 의 누적 결과를 얻을 수있는 방법이 있습니까  작업?

<시간>

예를 들어 다음과 같은 기능이 있다면

def my_fn(a, b):
    return a + b**2

functools.reduce 를 사용할 수 있습니다  얻기 위해

>>> from functools import reduce
>>> reduce(my_fn, foo)
60

내가 찾는 것은 다음을 제공하는 기능입니다

>>> cumreduce(my_fn, foo)
[10, 35, 44, 60]

즉, 결과의 각 요소는 reduce(my_fn, foo[:i]) 와 같습니다. .

<시간>

물론, 순진한 방법으로이 작업을 수행 할 수 있습니다

>>> def cumreduce(fn, seq):
...     return [reduce(fn, seq[:i]) for i in range(1, len(seq)+1)]
>>> cumreduce(my_fn, foo)
[10, 35, 44, 60]

이상적으로는 동일하거나 유사한 기능을 갖춘 내장 함수를 찾고 있습니다.


  • 답변 # 1

    파이썬에서 찾고있는 것은 itertools.accumulate 입니다. :

    import itertools
    [*itertools.accumulate(foo,my_fn)]
    # [10, 35, 44, 60]
    
    
    Numpy ufuncs에는 종종 축적 방법이 있습니다. 예 :

    np.bitwise_xor.accumulate(foo)
    array([10, 15, 12,  8])
    np.add.accumulate(foo)
    array([10, 15, 18, 22])
    # cf. cumsum:
    np.cumsum(foo)
    array([10, 15, 18, 22]
    
    

관련 자료

  • 이전 java - 블루투스 SPP 신비한 버퍼 오버 플로우, 안드로이드/BlueGiga WT12, 잠재적 인 흐름 제어 문제?
  • 다음 input - 스레드"main"javautilInputMismatchException의 예외이며 왜 그런지 모르겠습니다