簡體   English   中英

NumPy/SciPy 中的廣義累積函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM