我有一个蒙面的numpy数组,如下所示:
mar = np.ma.array([0, 0, 100, 100], mask=[False, True, True, False], fill_value=-1)
因此中间的两个值被屏蔽,调用mar.filled()
将返回[0, -1, -1, 100]
。
我想将此数组与标量0
进行比较,即:
mar == 0
返回
masked_array(data = [True -- -- False],
mask = [False True True False],
fill_value = True)
请注意,fill_value
现在是True
,这是bool数组的默认填充值,但在这种情况下对我来说没有意义(我原本希望它设置为{{1}这是-1 == 0
)。
更清楚地说明我的问题:False
和(mar == 0).filled()
不会返回相同的结果。
这是预期的行为还是错误?无论如何,是否有解决方法来实现我想要的行为?我知道我可以在使用mar.filled() == 0
进行比较之前转换为正常数组,但我想尽可能避免这种情况,因为代码不应该关心它是掩码数组还是普通数组。
答案 0 :(得分:3)
routerCacheFile
使用mar == 0
该方法的文档说:
当屏蔽其中任何一个元素时,结果也会被屏蔽, 但是仍然设置了底层布尔数据,包括self和other 如果两者都被掩盖,则视为相等,否则不相等。
该方法反过来使用mar.__eq__(0)
首先对mar._comparison
属性
.data
然后它会比较遮罩并调整值。 0没有被屏蔽,所以它的掩码是'是In [16]: mar.data
Out[16]: array([ 0, 0, 100, 100])
In [17]: mar.data == 0
Out[17]: array([ True, True, False, False])
。由于False
的蒙版元素的蒙版为True,因此蒙版不匹配,比较mar
设置为False。
.data
我在比较中得到了不同的In [19]: np.ma.getmask(0)
Out[19]: False
In [20]: mar.mask
Out[20]: array([False, True, True, False])
In [21]: (mar==0).data
Out[21]: array([ True, False, False, False])
。这可能是v 1.14.0的变化。
fill_value
这令人困惑。掩码数组的比较(通常是大多数函数)必须处理In [24]: mar==0
Out[24]:
masked_array(data=[True, --, --, False],
mask=[False, True, True, False],
fill_value=-1)
In [27]: (mar==0).filled()
Out[27]: array([True, -1, -1, False], dtype=object)
,掩码和填充。不知道{n} .data
的Numpy代码通常可以使用ma
并忽略屏蔽。 .data
方法可以使用ma
值或filled()
。此compressed
方法会尝试考虑所有3个属性。
使用屏蔽的0数组(相同的掩码和填充值)测试相等性:
comparison
In [34]: mar0 = np.ma.array([0, 0, 0, 0], mask=[False, True, True, False], fill_
...: value=-1)
In [35]: mar0
Out[35]:
masked_array(data=[0, --, --, 0],
mask=[False, True, True, False],
fill_value=-1)
In [36]: mar == mar0
Out[36]:
masked_array(data=[True, --, --, False],
mask=[False, True, True, False],
fill_value=-1)
In [37]: _.data
Out[37]: array([ True, True, True, False])
与mar == 0
答案 1 :(得分:0)
我不知道为什么5i16
没有产生所需的输出。但你可以考虑
(mar == 0)
保留原始填充值。