记下一个蒙面数组 - python

时间:2012-08-07 23:28:26

标签: python arrays numpy ctypes memmove

我有一个不包含数据值的numpy数组。我屏蔽了那些没有数据值,因此它们不会影响我的计算:

    array = numpy.ma.masked_values(array, options['ndv'], copy=False)

然后我使用memmove将numpy数组转换为共享ctypes数组:

def ndarray_to_shmem(array):
    """ Converts a numpy.ndarray to a multiprocessing.Array object.

    The memory is copied, and the array is flattened.
    """
    arr = array.reshape((-1, ))
    data = RawArray(_numpy_to_ctypes[array.dtype.type], 
                                    arr.size)
    ctypes.memmove(data, array.data[:], len(array.data))
    return data

返回以下堆栈跟踪:

ctypes.memmove(data, array.data[:], len(array.data))
ctypes.ArgumentError: argument 2: <type 'exceptions.TypeError'>: wrong type

是否可以使用memmove将屏蔽数组移动到共享的ctypes数组中?

1 个答案:

答案 0 :(得分:2)

首先,您需要更改此行:

ctypes.memmove(data, array.data[:], len(array.data))

看起来像这样:

ctypes.memmove(data, array.data[:].ctypes.data, len(array.data))

第二次,ctypes.memmove不了解屏蔽数组。相反,只需将掩盖区域设置为nan:

进行复制
masked = array.copy()
masked[array == options['ndv']] = np.nan

...

ctypes.memmove(data, masked.ctypes.data, len(masked))