使用自定义函数迭代和累积 numpy 数组
Iterating and accumulating over a numpy array with a custom function
相关的问题已经有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]
在此先感谢您的帮助!
您可以使用 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)
相关的问题已经有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]
在此先感谢您的帮助!
您可以使用 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)