我正在使用多处理模块操作numpy数组,并且遇到了一些尝试我在这里运行的代码的问题。具体来说,我从一个numpy数组创建一个ctypes数组,然后尝试将ctypes数组返回到一个numpy数组。这是代码:
shared_arr = multiprocessing.RawArray(_numpy_to_ctypes[array.dtype.type],array.size)
我不需要任何类型的同步锁,所以我使用的是RawArray。基于输入数组的dtype从字典中提取ctypes数据类型。这非常有效。
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的这个组件。
建议?
答案 0 :(得分:7)
由于你使用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