繁体   English   中英

在python多处理中共享和编辑numpy数组

[英]Sharing and editing numpy array in python multiprocessing

我正在用 python 中的多处理对 numpy 进行实验,我已经阅读了大量教程和 stackoverflow 答案。 我写了一个代码:

from multiprocessing import Process, Array
import numpy as np

def main():
    im_arr = np.array([[1,2,3],[4,6,7]])
    print('Array in main before process:',im_arr)

    shape = im_arr.shape
    size = im_arr.size
    im_arr.shape = size
    arr = Array('B', im_arr)   
    p = Process(target=fun, args=(arr,shape))
    p.start()
    p.join()

    arr = np.frombuffer(arr.get_obj(), dtype=np.uint8)
    arr.shape = shape
    print('Array in main after process:',arr)

def fun(a, shape):
    a = np.frombuffer(a.get_obj(), dtype=np.uint8)
    a.shape = shape

    a[0][0] = 10
    a = np.array([[0,0,0],[0,0,0]])
    a[0][0] = 5

    print('Array inside function:',a)
    a.shape = shape[0]*shape[1]

if __name__ == '__main__':
    main()

我希望做的是共享一个 numpy 数组并在另一个进程中编辑该数组,同时在主程序中也可以观察到变化。 但我得到的输出如下

('Array in main before process:', array([[1, 2, 3],
       [4, 6, 7]]))
('Array inside function:', array([[5, 0, 0],
       [0, 0, 0]]))
('Array in main after process:', array([[10,  2,  3],
       [ 4,  6,  7]], dtype=uint8))

在将 numpy 数组保存到函数中后,函数中的 'a' 似乎表现得像一个新的独立对象。

请纠正我做错了什么。

我建议为此使用内存映射。 首先,在其中一个进程中创建您的数组:

im_arr = np.array([[1,2,3],[4,6,7]])

然后,将其保存到磁盘:

np.save('im_arr.npy', im_arr)

然后,在每个进程中加载​​它,使用mode='r+'以便您可以修改它:

im_arr = np.load('im_arr.npy', 'r+')

现在,内容将始终对两个进程可见。

在将 numpy 数组保存到函数中后,函数中的 'a' 似乎表现得像一个新的独立对象。

嗯,这在一定程度上是正确的。 使用np.array([[0,0,0],[0,0,0]])创建一个新的独立对象,然后使用a =将标签a附加到它。 从那时起,标签a不再指向共享数组。

如果你想在共享内存中保存一个新数组,你可以使用

a[...] = np.array([[0,0,0],[0,0,0]])

(这实际上是有效的语法, ...称为省略号文字)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM