我有一个掩盖的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 == 0
,即False
(。
更清楚地说明我的问题: (mar == 0).filled()
和 mar.filled() == 0
不要返回相同的结果。
这是意图的行为还是错误?无论如何,是否有能力实现我所需的行为?我知道我可以在使用.filled()
进行比较之前将其转换为普通数组,但我想在可能的情况下避免使用,因为代码不应该关心它是蒙版数组还是正常的数组。
mar == 0
使用 mar.__eq__(0)
该方法的文档说:
当两个元素被掩盖时,结果也被掩盖了 但是,基本的布尔数据仍在设置下,与自我和其他 如果两者都被掩盖并且不等,则认为相等。
该方法依次使用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
的掩模元素的掩码是正确的,因此掩码不匹配,并且比较.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)
我不知道为什么(mar == 0)
不会产生所需的输出。但是您可以考虑
np.equal(mar, 0)
保留原始填充值。