与标量相比,numpy掩盖数组不考虑fill_value



我有一个掩盖的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 == 0mar == np.ma.array([0, 0, 0, 0], mask=False)

相同

我不知道为什么(mar == 0)不会产生所需的输出。但是您可以考虑

np.equal(mar, 0)

保留原始填充值。

最新更新