在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 )
答案 0 :(得分:11)
NumPy的ufuncs有accumulate()
:
In [22]: np.multiply.accumulate([[1, 2, 3], [4, 5, 6]], axis=1)
Out[22]:
array([[ 1, 2, 6],
[ 4, 20, 120]])
不幸的是,在accumulate()
'ed Python函数上调用frompyfunc()
失败并出现一个奇怪的错误:
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。
答案 1 :(得分:8)
上面的ValueError仍然是使用Numpy 1.9.1(使用Python 2.7.9)的错误。
幸运的是,发现了一种使用强制转换的解决方法: https://groups.google.com/forum/#!topic/numpy/JgUltPe2hqw
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])