【发布时间】:2016-02-17 16:20:15
【问题描述】:
我想用mask 屏蔽一个numpy 数组a。掩码与a 的形状不完全相同,但无论如何都可以掩码a(我猜是因为附加维度是一维的(广播?))。
a.shape
>>> (3, 9, 31, 2, 1)
mask.shape
>>> (3, 9, 31, 2)
masked_a = ma.masked_array(a, mask)
但是,同样的逻辑不适用于数组 b,它的最后一维有 5 个元素。
ext_mask = mask[..., np.newaxis] # extending or not extending has same effect
ext_mask.shape
>>> (3, 9, 31, 2, 1)
b.shape
>>> (3, 9, 31, 2, 5)
masked_b = ma.masked_array(b, ext_mask)
>>> numpy.ma.core.MaskError: Mask and data not compatible: data size is 8370, mask size is 1674.
如何通过将(3, 9, 31, 2) 掩码的最后一个维度中的任何True 值扩展为[True, True, True, True, True](分别为False)从(3, 9, 31, 2) 掩码创建(3, 9, 31, 2, 5) 掩码?
【问题讨论】:
-
这行得通:
masked_b = ma.masked_array(*np.broadcast(b, ext_mask)),但我不知道为什么ma.masked_array没有自动广播。编辑:也许是因为它只想将视图存储到两个大小相等的数组中以提高效率? -
这给了
TypeError: __new__() takes at most 11 arguments (8371 given) -
呃,对不起,我的错!
broadcast是错误的功能。您需要使用broadcast_arrays。 -
文档说
broadcast_arrays将视图返回到原始数组中,这意味着不执行任何分配。 -
是的,我会写一个答案,但首先我要对该主题进行更多研究:)