Обобщенные кумулятивные функции в 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])
Другие вопросы по тегам