我正在使用多处理模块处理 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'
我还尝试了来自 this post 的以下内容,但出现相同的错误。
def tonumpyarray(shared_arr):
return numpy.frombuffer(shared_arr.get_obj())
我在运行 python 2.6 时卡住了,不知道这是否是问题所在,是否是共享变量名的问题(我试图尽可能降低内存使用率,并且尽量不复制 numpy 数组和内存中的 ctypes 数组),或者其他一些我刚刚学习的 python 组件。
建议?
最佳答案
因为你使用了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
关于Python 共享内存数组,没有属性 get_obj(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11693714/