NumPy / SciPy中的广义累积函数?

时间:2022-02-04 21:20:02

Is there a function in numpy or scipy (or some other library) that generalizes the idea of cumsum and cumprod to arbitrary function. For example, consider the (theoretical) function

在numpy或scipy(或其他一些库)中是否存在将cumsum和cumprod的概念概括为任意函数的函数。例如,考虑(理论)函数

cumf( func, array) 

func is a function that accepts two floats, and returns a float. Particular cases

func是一个接受两个浮点数的函数,并返回一个浮点数。特殊情况

lambda x,y: x+y 

and

lambda x,y: x*y 

are cumsum and cumprod respectively. For example, if

分别是cumsum和cumprod。例如,如果

func = lambda x,prev_x: x^2*prev_x 

and I apply it to:

我将其应用于:

cumf(func, np.array( 1, 2, 3) )

I would like

我想要

np.array( 1, 4, 9*4 )

2 个解决方案

#1


10  

NumPy's ufuncs have accumulate():

NumPy的ufuncs有累积():

In [22]: np.multiply.accumulate([[1, 2, 3], [4, 5, 6]], axis=1)
Out[22]: 
array([[  1,   2,   6],
       [  4,  20, 120]])

Unfortunately, calling accumulate() on a frompyfunc()'ed Python function fails with a strange error:

不幸的是,在frompyfunc()'ed Python函数上调用accumulate()失败并出现一个奇怪的错误:

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'

This is using NumPy 1.6.1 with Python 2.7.3.

这是使用NumPy 1.6.1和Python 2.7.3。

#2


6  

The ValueError above is still a bug using Numpy 1.9.1 (with Python 2.7.9).

上面的ValueError仍然是使用Numpy 1.9.1(使用Python 2.7.9)的错误。

Luckily a workaround was discovered that uses casting: https://groups.google.com/forum/#!topic/numpy/JgUltPe2hqw

幸运的是,发现了一种使用强制转换的解决方法: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])

#1


10  

NumPy's ufuncs have accumulate():

NumPy的ufuncs有累积():

In [22]: np.multiply.accumulate([[1, 2, 3], [4, 5, 6]], axis=1)
Out[22]: 
array([[  1,   2,   6],
       [  4,  20, 120]])

Unfortunately, calling accumulate() on a frompyfunc()'ed Python function fails with a strange error:

不幸的是,在frompyfunc()'ed Python函数上调用accumulate()失败并出现一个奇怪的错误:

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'

This is using NumPy 1.6.1 with Python 2.7.3.

这是使用NumPy 1.6.1和Python 2.7.3。

#2


6  

The ValueError above is still a bug using Numpy 1.9.1 (with Python 2.7.9).

上面的ValueError仍然是使用Numpy 1.9.1(使用Python 2.7.9)的错误。

Luckily a workaround was discovered that uses casting: https://groups.google.com/forum/#!topic/numpy/JgUltPe2hqw

幸运的是,发现了一种使用强制转换的解决方法: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])