7

我正在使用多处理模块操作 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的这个组件的其他东西。

建议?

4

1 回答 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
于 2012-07-30T04:12:54.477 回答