【问题标题】:python multiprocessing shared memory array doesn't allow 2-d arraypython多处理共享内存数组不允许二维数组
【发布时间】:2023-03-15 18:55:02
【问题描述】:

我想将二维数组存储为共享内存数组,因此多处理模块创建的每个进程都可以访问二维数组。但似乎只允许使用矢量。如果我将以下示例中的形状从 (6,1) 更改为 (2,3),则示例将不起作用,并显示“TypeError:只有长度为 1 的数组可以转换为 Python 标量”

from multiprocessing import Process, Value, Array
import numpy as np

def f(n,a):
    a[:] = np.ones(shape=(6,1), dtype=float)[:]

if __name__ == '__main__':
    tmp =  np.zeros(shape=(6,1), dtype=float)
    print tmp

    arr = Array('f', tmp)

    p1 = Process(target=f, args=(1,arr))
    p1.start()
    p1.join()

    print 'done'
    print arr[:]

【问题讨论】:

    标签: python memory-management process multiprocessing shared-memory


    【解决方案1】:

    这是因为mutiprocessing.Array 是python 的array 类型的包装器,而不是numpy.ndarray 和python 的array 类型不支持多维。具体来说,请查看initializer 的文档:

    一个新数组,其项目受类型代码限制,并从可选的初始化值初始化,该值必须是列表、字符串或可迭代适当类型的元素。

    你有一个可迭代的(一个多维数组),但它产生视图/数组,而不是适当类型的元素。

    【讨论】:

    • 有没有快速将 numpy.ndarray 转换为数组的方法?
    • @readRead -- 只有一维 numpy 数组可以转换为 array -- 并且它会复制(不是视图)
    • 谢谢。我计划在每个进程中对共享数组进行一些矩阵操作。如果我只存储一维数组,那不是很方便。如何跨进程共享二维 numpy 数组并避免复制?也许使用 multiprocessing.Array 以外的东西?
    • 我不完全相信这是可能的。据我所知,您能做的最好的事情就是围绕 Array/array 创建一个包装器,它提供了一个更好的界面。
    • 如果我在 Array/array 周围创建一个包装器,它将一维数组转换为二维 numpy.ndarray,这是否涉及额外的复制?
    猜你喜欢
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多