19

numpy または scipy (または他のライブラリ) に、cumsum と cumprod の概念を任意の関数に一般化する関数はありますか。たとえば、(理論上の)関数を考えてみましょう

cumf( func, array) 

func は、2 つの float を受け取り、float を返す関数です。特定のケース

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 )
4

2 に答える 2

13

上記の ValueError は、まだ Numpy 1.20.1 (Python 3.9.1 を使用) を使用した場合のバグです。

幸いなことに、キャストを使用する回避策が発見されました: https://groups.google.com/forum/#!topic/numpy/JgUltPe2hqw

import numpy as np
uadd = np.frompyfunc(lambda x, y: x + y, 2, 1)
uadd.accumulate([1,2,3], dtype=object).astype(int)
# array([1, 3, 6])

カスタム操作はオブジェクト型で機能するため、numpy の効率的なメモリ管理の恩恵を受けないことに注意してください。そのため、非常に大きな配列のオブジェクトにキャストする必要のない操作よりも操作が遅くなる可能性があります。

于 2015-01-12T23:11:00.153 に答える
12

NumPy の ufunc には次のものがありaccumulate()ます。

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

残念ながら、'ed Python 関数の呼び出しaccumulate()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'

これは Python 2.7.3 で NumPy 1.6.1 を使用しています。

于 2012-12-11T21:14:31.470 に答える