numpy MaskedConstant给bool提供了不一致的转换

时间:2014-07-29 06:01:04

标签: python numpy

在Numpy Python中,1.8.0:

似乎在使用聚合函数(min,max)而不是屏蔽数组时,结果可能是MaskedConstant会导致真正的麻烦。由于以下奇怪的行为,这使得危险性更加脆弱。

import numpy
testC = numpy.ma.masked_array([1,2],[True,True]).min()
print type(testC) # -> <class 'numpy.ma.core.MaskedConstant'> 
print bool((testC==None)) # -> False 
print bool((testC!=None)) # -> False (???) 

我讨厌使用isinstance或者其他东西,因为我觉得这样会联系到这种内部类型类(我认为)。我可以通过小心测试!=来进行测试工作,因为那时任何其他有效数字都应该通过。但我觉得这很危险,因为如果倒置逻辑应该是正确的,并且考虑到这种行为,它不是。

我试图安全地积累很多不同的人。我无法加载它们,我需要结合部分聚合的结果。正是在这种组合中,我偶然发现了这一点。

1 个答案:

答案 0 :(得分:0)

在您的代码中,numpy.ma.masked_array([1,2], [True,True]).min()返回的值为masked(即numpy.ma.maskednumpy.ma.core.MaskedConstant的实例。这就是numpy蒙面数组代码如何处理尝试找到实际上是空集的最小值的方法。将其与常规numpy数组的行为进行比较:

In [36]: np.array([]).min()
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-33-a63f9cff1d67> in <module>()
----> 1 np.array([]).min()
...<snip>...

ValueError: zero-size array to reduction operation minimum which has no identity

如果实例(即__eq__)为MaskedConstant,则masked类的self方法返回masked,无论其他参数是什么。换句话说,masked == <anything else here>会返回masked。例如,

In [28]: from numpy.ma import masked

In [29]: type(masked)
Out[29]: numpy.ma.core.MaskedConstant

In [30]: masked == 99
Out[30]: masked

In [31]: masked == [1, 2, 3]
Out[31]: masked

In [32]: masked == masked
Out[32]: masked

要测试此值,您可以使用is

In [33]: masked is masked
Out[33]: True

In [34]: masked is 99
Out[34]: False

In [35]: masked is None
Out[35]: False

在您的代码中,您可以使用min测试testC is masked方法的返回值。发生这种情况时,表示此批次中的所有值都被屏蔽,因此该批次对所有屏蔽数组的聚合最小值没有影响。