[英]generalized cumulative functions in 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 )
NumPy 的 ufuncs 有 accum 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.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 的高效內存管理。 因此,對於超大數組,該操作可能比不需要強制轉換為對象的操作慢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.