与标量比较时,NumPy屏蔽数组不考虑fill_value

时间:2018-02-21 09:54:29

标签: python numpy

我有一个蒙面的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进行比较之前转换为正常数组,但我想尽可能避免这种情况,因为代码不应该关心它是掩码数组还是普通数组。

2 个答案:

答案 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)

保留原始填充值。