使用自定义函数在numpy数组上迭代和累加

使用自定义函数在numpy数组上迭代和累加,numpy,tensorflow,iterator,numpy-ufunc,Numpy,Tensorflow,Iterator,Numpy Ufunc,有一些相关的问题已经存在了7年多了,但我再次提出这个问题,因为我看不到提供的“numpy”方式迭代方法 任务如下: 如果我有一个numpy数组'arr'和一个自定义函数'fn',我如何在'arr'上迭代应用'fn'? “fn”不能由ufunc工具构造 下面是我想出的玩具代码: import numpy as np r_list = np.arange(1,6,dtype=np.float32) # r_list = [1. 2. 3. 4. 5.] r_list_extended = np.a

有一些相关的问题已经存在了7年多了,但我再次提出这个问题,因为我看不到提供的“numpy”方式迭代方法

任务如下: 如果我有一个numpy数组'arr'和一个自定义函数'fn',我如何在'arr'上迭代应用'fn'? “fn”不能由ufunc工具构造

下面是我想出的玩具代码:

import numpy as np

r_list = np.arange(1,6,dtype=np.float32)
# r_list = [1. 2. 3. 4. 5.]
r_list_extended = np.append([0.],r_list)
R_list_extended = np.zeros_like(r_list_extended)
print(r_list)
gamma = 0.99
pv_mc = lambda a, x: x+ a*gamma

# no cumsum, accumulate available
for i in range(len(r_list_extended)):
    if i ==0: continue
    else: R_list_extended[i] = pv_mc(R_list_extended[i-1],r_list_extended[i])

R_list = R_list_extended[1:]
print(R_list)
# R_list == [ 1.          2.99        5.9601      9.900499   14.80149401]
r_list是每次r的数组。 R_列表是贴现R的累计总和。 假设r_列表和r_列表已预先还原。 上面的循环没有R[t]:R[t]+gamma*R[t-1]

我不认为这是利用numpy的最佳方式。。。。 如果可以利用tensorflow,那么tf.scan()的工作如下:

import numpy as np
import tensorflow as tf

r_list = np.arange(1,6,dtype=np.float32)
# r_list = [1. 2. 3. 4. 5.]
gamma = 0.99
pv_mc = lambda a, x: x+ a*gamma
R_list_graph = tf.scan(pv_mc, r_list, initializer=np.array(0,dtype=np.float32))

with tf.Session() as sess:
    R_list = sess.run(R_list_graph, feed_dict={})
    print(R_list)
    # R_list = [ 1.        2.99      5.9601    9.900499 14.801495]
提前感谢您的帮助

您可以使用,它的文档有点晦涩难懂

import numpy as np

r_list = np.arange(1,6,dtype=np.float32)
# r_list = [1. 2. 3. 4. 5.]
r_list_extended = np.append([0.],r_list)
R_list_extended = np.zeros_like(r_list_extended)
print(r_list)
gamma = 0.99
pv_mc = lambda a, x: x+ a*gamma
ufunc = np.frompyfunc(pv_mc, 2, 1)
R_list = ufunc.accumulate(r_list, dtype=np.object).astype(float)
print(R_list)

我已经多次向Pyfunc推荐了
frompyfunc
,但没有意识到它使用
acculate
等方法返回
ufunc
。在其他地方,我发现与显式循环相比,它最多能提供2倍的加速。在这里,它似乎给出了1.5的加速,并且仍然比
cumsum
gamma=1
情况)慢20倍。
dtype=object
是一个很容易忽略的重要参数
frompyfunc
返回一个对象数组。哦,这太棒了。是的,我在“矢量化”之类的东西上闲逛过,但np.frompyfunc是我能做的最好的选择。正如@hpaulj所提到的,我不理解/喜欢为什么np.object只允许累加,因为它使计算速度变慢&最后需要另一个属性转换器.astype(float)。但同样,dtype只接受np.object(而不是np.float),所以我认为这个答案可能是正确的。但让我等一下其他人怎么想,“返回的ufunc总是返回PyObject数组。”-他们是这么说的,,,无法避免使用“object”数据类型*更新:对于这个特定的计算,scipy.signal.lfilter使您的生活更轻松