mar == 0 使用mar.__eq__(0)
该方法的文档说:
当任何一个元素被屏蔽时,结果也会被屏蔽,
但底层布尔数据仍然设置,self和other
如果两者都被屏蔽,则认为相等,否则不相等。
该方法又使用mar._comparison
这首先对.data属性进行比较
In [16]: mar.data
Out[16]: array([ 0, 0, 100, 100])
In [17]: mar.data == 0
Out[17]: array([ True, True, False, False])
然后它会比较掩码并调整值。 0 没有被屏蔽,所以它的“掩码”是False。由于mar的被屏蔽元素的掩码为True,所以掩码不匹配,比较.data设置为False。
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])
在比较中我得到了不同的fill_value。这可能是 v 1.14.0 的变化。
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)
这令人困惑。掩码数组上的比较(通常是大多数函数)必须处理.data、掩码和填充。不知道 ma 的 Numpy 代码通常适用于 .data 并忽略屏蔽。 ma 方法可以使用filled() 值或compressed。这个comparison 方法尝试将所有 3 个属性都考虑在内。
用掩码 0 数组(相同的掩码和填充值)测试相等性:
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 与mar == np.ma.array([0, 0, 0, 0], mask=False) 相同