python多处理中numpy数组的共享与编辑

python多处理中numpy数组的共享与编辑,python,numpy,multiprocessing,shared-memory,Python,Numpy,Multiprocessing,Shared Memory,我在用python进行numpy多处理实验,我读了很多教程和答案。 我写了一段代码: 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_a

我在用python进行numpy多处理实验,我读了很多教程和答案。 我写了一段代码:

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))
似乎函数中的“a”在保存numpy数组后的行为类似于一个新的独立对象


请纠正我的错误。

我建议使用内存映射。首先,在以下过程之一中创建阵列:

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+')
现在,内容将始终对两个进程可见

似乎函数中的“a”在保存numpy数组后的行为类似于一个新的独立对象

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

如果要在共享内存中保存新阵列,可以使用

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

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

np.save()
cpickle
ing.快?@AnuragJk:一般来说,是的。试试看。