Python 共享内存数组, 没有 get_obj() 属性。

7

我正在使用multiprocessing模块操纵numpy数组,但在尝试一些代码时遇到了问题。特别地,我正在从一个numpy数组创建ctypes数组,然后尝试将该ctypes数组返回给一个numpy数组。以下是代码:

    shared_arr = multiprocessing.RawArray(_numpy_to_ctypes[array.dtype.type],array.size)

我不需要任何类型的同步锁,因此我正在使用RawArray。 ctypes数据类型是根据输入数组的dtype从字典中提取的。 这个方法非常有效。

    shared_arr = numpy.ctypeslib.as_array(shared_arr.get_obj())

这里我得到了一个堆栈跟踪,指出:

    AttributeError: 'c_double_Array_16154769' object has no attribute 'get_obj'

我也尝试了这篇文章中提到的方法,但是仍然出现相同的错误。
    def tonumpyarray(shared_arr):
        return numpy.frombuffer(shared_arr.get_obj())  

我卡在了运行Python 2.6的问题上,不确定这是否是问题所在,还有可能是变量名共享的问题(我尽可能地保持内存使用率低,并且试图不在内存中重复numpy数组和ctypes数组),或者其他一些原因,因为我刚开始学习Python的这个组件。

有什么建议吗?


我应该补充一下,我并不想回到一个numpy数组,只是返回一个ctypes数组的视图,这样我就可以将其写成一个numpy数组(如果我正确理解操作顺序的话)。 - Jzl5325
1个回答

11

如果您使用RawArray,那么它只是从共享内存分配的ctypes数组,没有包装对象,因此您不需要使用get_obj()方法来获取包装对象:

>>> shared_arr = multiprocessing.RawArray("d",10)
>>> t = np.frombuffer(shared_arr, dtype=float)
>>> t[0] = 2
>>> shared_arr[0]
2.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接