Jzl*_*325 5 python ctypes numpy multiprocessing
我正在使用多处理模块操作numpy数组,并且遇到了一些问题,尝试了我在这里运行的一些代码.具体来说,我从一个numpy数组创建一个ctypes数组,然后尝试将ctypes数组返回到一个numpy数组.这是代码:
shared_arr = multiprocessing.RawArray(_numpy_to_ctypes[array.dtype.type],array.size)
Run Code Online (Sandbox Code Playgroud)
我不需要任何类型的同步锁,所以我使用的是RawArray.基于输入数组的dtype从字典中提取ctypes数据类型.这非常有效.
shared_arr = numpy.ctypeslib.as_array(shared_arr.get_obj())
Run Code Online (Sandbox Code Playgroud)
在这里,我得到一个堆栈跟踪说明:
AttributeError: 'c_double_Array_16154769' object has no attribute 'get_obj'
Run Code Online (Sandbox Code Playgroud)
我也从这篇文章中尝试了以下内容,但得到了相同的错误.
def tonumpyarray(shared_arr):
return numpy.frombuffer(shared_arr.get_obj())
Run Code Online (Sandbox Code Playgroud)
我被困在运行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
Run Code Online (Sandbox Code Playgroud)