使用自定义函数迭代和累积numpy数组

时间:2018-05-21 18:04:45

标签: numpy tensorflow iterator numpy-ufunc

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

任务如下: 如果我有一个numpy数组'arr'并且有一个自定义函数'fn',我怎么能在'arr'上迭代地应用'fn'? 'fn'不能由ufunc工具构建。

以下是我提出的toy_code:

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_list是折扣r的累积和。 假设事先还原了r_list和R_list。 上面的循环做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]

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您可以使用np.frompyfunc,其文档有点模糊。

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)