【问题标题】:memove a masked array - python删除一个蒙面数组 - python
【发布时间】:2012-08-07 23:28:25
【问题描述】:

我有一个不包含数据值的 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 数组中?

【问题讨论】:

  • 当您移动掩码数组时,您究竟期望发生什么?您是否希望仅获得未屏蔽的值?是否应该将无值条目转换为 nan?
  • 转换为 NaN。在执行一些计算后,我将转换回输入的无数据值。

标签: python arrays numpy ctypes memmove


【解决方案1】:

首先,您需要更改这一行:

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))

【讨论】:

  • 卢克,为什么是第一项?由于您最初的评论,刚刚通过 numpy 文档偶然发现了第二个。谢谢!
  • 使用array.ctypes.data的要求是因为ctypes不了解numpy数组(给定一个numpy数组,ctypes不知道如何定位它包含的数组数据)。属性array.ctypes.data只是一个指向其中包含的内存数组的指针,ctypes能够理解。
猜你喜欢
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
相关资源
最近更新 更多