【问题标题】:Removing for loops to enable parallel computing with numpy arrays移除 for 循环以启用 numpy 数组的并行计算
【发布时间】:2020-12-26 08:33:10
【问题描述】:

有没有什么方法(比如用于并行处理的 numpy 数组的矢量化)来移除两个 for 循环并并行化这段代码?

state_returns = np.zeros((10,10,dtype = np.ndarray))
value_function = np.zeros((10,10))
........................#further code to fill the values in array:state_returns
........................#Eg. state_returns = [[[1,2,3,..],[2,3,6,...],...],[[3,9,7,...],[5,8,6...],....],......]
........................#Eg. value_function = [[2,4,6,....],[6,5,7,...],....]
for i in range(10):
    for j in range(10):
        n = state_returns[i,j].shape[0]-1
        value_function[i,j] = state_returns[i,j].sum()/n if (n!=0) else 0

【问题讨论】:

  • 有点困惑。 state_returns[i,j] 始终是一个标量,因此采用 .sum() 没有任何意义。如果你能更好地解释你想要做什么(现实输入,预期输出),我相信我们可以使用基本广播摆脱循环
  • @PaulH 鉴于 state_returns 的元素具有 dtype = np.ndarray,因此所有元素都是 numpy 数组。此外,包含在 10*10 numpy 数组中的所有这些数组元素可以具有不同的大小(n,)。
  • 如果你的数组不乱,你根本不需要循环
  • 请提供一个合适的工作示例。您的示例数组不完整。您对np.zeros 的使用是错误的。在尝试“并行处理”之前,请尝试编写有效的 numpy 代码。

标签: arrays numpy for-loop parallel-processing numpy-ndarray


【解决方案1】:

如果我是正确的,您的计算是元素方面的。即value_function[i,j] 的值对i != nj != mvalue_function[n,m] 没有影响。这意味着您可以轻松地并行运行代码。这是一个使用线程库和 10 个线程的示例(我实际上并没有检查代码是否有效,但希望您能明白):

import threading      

def calculation(i):
    global state_returns, value_function
    for j in range(10):
        n = state_returns[i,j].shape[0]-1
        value_function[i,j] = state_returns[i,j].sum()/n if (n!=0) else 0

if __name__ == '__main__': 
    t = []
    for i in range(0, 10):
        t.append(threading.Thread(target=calculation, args=(i,)))
    for i in range(0, 10):
        t[i].start()
    for i in range(0, 10):
        t[i].join()

如果遇到问题,您可能需要锁定 def 中的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多