我一直在阅读掩码数组文档,但我很困惑 - MaskedArray 与仅维护一个值数组和一个布尔掩码有什么不同?有人可以给我一个示例,其中 MaskedArrays 更方便或性能更高吗?
更新 6/5
为了更具体地说明我的问题,这是一个如何使用 MaskedArray 的经典示例:
>>>data = np.arange(12).reshape(3, 4)
>>>mask = np.array([[0., 0., 1., 0.],
[0., 0., 0., 1.],
[0., 1., 0., 0.]])
>>>masked = np.ma.array(data, mask=mask)
>>>masked
masked_array(
data=[[0, 1, --, 3],
[4, 5, 6, --],
[8, --, 10, 11]],
mask=[[False, False, True, False],
[False, False, False, True],
[False, True, False, False]],
fill_value=999999)
>>>masked.sum(axis=0)
masked_array(data=[12, 6, 16, 14], mask=[False, False, False, False], fill_value=999999)
我也可以这样轻松地做同样的事情:
>>>data = np.arange(12).reshape(3, 4).astype(float)
>>>mask = np.array([[0., 0., 1., 0.],
[0., 0., 0., 1.],
[0., 1., 0., 0.]]).astype(bool)
>>>masked = data.copy() # this keeps the original data reuseable, as would
# the MaskedArray. If we only need to perform one
# operation then we could avoid the copy
>>>masked[mask] = np.nan
>>>np.nansum(masked, axis=0)
array([12., 6., 16., 14.])
我想 MaskedArray 版本看起来更好一些,如果你需要一个可重用的数组,可以避免复制。从标准 ndarray 转换为 MaskedArray 时,它不会使用同样多的内存吗?并且在将掩码应用于数据时是否避免了引擎盖下的副本?还有其他优点吗?