矩阵Z的定义如下:
N = 15
Z = np.zeros((N, N))
我希望不同的线程填充它,所以我需要创建一个共享内存矩阵或数组。我这样做:
Z_shared = Array('d', Z)
但是我收到了这个错误:
TypeError: only length-1 arrays can be converted to Python scalars
我认为这意味着Array不接受矩阵。是否有另一个功能可以完成我需要的功能,或者我应该先将Z转换为矢量然后将其传递给Array。如果是这样,有一个功能可以为我做这个。我不想循环Z,因为N可能非常大。
我在另一个被调用的函数中填充Z_shared:
from multiprocessing import Pool, Array
pool = Pool(processes=1)
def foo(data):
x, y, val = data
Z_shared[x][y] = val
pool.map(fooe, DATA)
'data'是索引和值的元组,'DATA'是元组的列表。
谢谢
答案 0 :(得分:0)
严格地回答这个问题,如果Array构造的对象就像一个列表,你可以像这样复制所有内容:
Z_shared = Array('d', Z.size)
Z_shared[:] = Z.reshape((-1)) # copy entrywise
但是,这似乎很糟糕。首先,共享数组不具有ndarray语义,并且将是一个副本。它真的需要是一个共享变量吗?
你在程序中分成N * N个进程,其中N可能很大。制作新工艺可能很昂贵。我认为你应该只分割成拥有核心的进程。
所以我的想法是,基于x坐标分割数据,并有一个处理矩阵的上半部分,另一个处理下半部分。两者都是共享内存中的独立数组。
在阅读您的问题时,您不应该首先使用多处理(过早优化!)。相反,请查看稀疏矩阵:http://docs.scipy.org/doc/scipy/reference/sparse.html