Обобщенные кумулятивные функции в NumPy/SciPy?
Есть ли функция в numpy или scipy (или в какой-то другой библиотеке), которая обобщает идею cumsum и cumprod для произвольной функции. Например, рассмотрим (теоретическую) функцию
cumf( func, array)
func - это функция, которая принимает два числа с плавающей точкой и возвращает число с плавающей точкой. Частные случаи
lambda x,y: x+y
а также
lambda x,y: x*y
являются cumsum и cumprod соответственно. Например, если
func = lambda x,prev_x: x^2*prev_x
и я применяю это к:
cumf(func, np.array( 1, 2, 3) )
мне бы хотелось
np.array( 1, 4, 9*4 )
2 ответа
Уфунки NumPy имеют accumulate()
:
In [22]: np.multiply.accumulate([[1, 2, 3], [4, 5, 6]], axis=1)
Out[22]:
array([[ 1, 2, 6],
[ 4, 20, 120]])
К сожалению звоню accumulate()
на frompyfunc()
'Сбой Python-функции со странной ошибкой:
In [32]: uadd = np.frompyfunc(lambda x, y: x + y, 2, 1)
In [33]: uadd.accumulate([1, 2, 3])
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
ValueError: could not find a matching type for <lambda> (vectorized).accumulate,
requested type has type code 'l'
Это использует NumPy 1.6.1 с Python 2.7.3.
Ошибка ValueError по-прежнему является ошибкой при использовании Numpy 1.9.1 (с Python 2.7.9).
К счастью, был найден обходной путь, который использует приведение: https://groups.google.com/forum/
In [34]: uadd = np.frompyfunc(lambda x, y: x + y, 2, 1)
In [35]: uadd.accumulate([1,2,3], dtype=np.object).astype(np.int)
Out[35]: array([1, 3, 6])