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

Python numpy MaskedConstant提供了到bool的不一致转换,python,numpy,Python,Numpy,在Numpy Python中,1.8.0: 似乎在使用屏蔽数组上的聚合函数(最小值、最大值)时,结果可能是屏蔽常量,这可能会引起真正的麻烦。由于以下奇怪的行为,它变得更加脆弱 import numpy testC = numpy.ma.masked_array([1,2],[True,True]).min() print type(testC) # -> <class 'numpy.ma.core.MaskedConstant'> print bool((testC==Non

在Numpy Python中,1.8.0:

似乎在使用屏蔽数组上的聚合函数(最小值、最大值)时,结果可能是屏蔽常量,这可能会引起真正的麻烦。由于以下奇怪的行为,它变得更加脆弱

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 (???) 
导入numpy
testC=numpy.ma.masked_数组([1,2],[True,True]).min()
打印类型(testC)#->
打印bool((testC==None))#->False
打印布尔值((testC!=None))#->False(?)
我不喜欢使用isinstance之类的东西,因为我觉得它会耦合到这种内部类型类(我想)。通过仔细测试,我可以让测试工作正常,从那时起,任何其他有效数字都应该通过。但我觉得这是危险的,因为逻辑应该是正确的,如果倒过来的话,考虑到这种行为,它不是


我正在尝试安全地将min累积到许多不同的ma。我不能全部加载,我需要合并部分聚合的结果。正是在这个组合中,我无意中发现了这个问题。

在您的代码中,
numpy.ma.masked_数组([1,2],[True,True]).min()返回的值是
masked
(即
numpy.ma.masked
,是
numpy.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
要测试此值,可以使用
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

在代码中,可以使用
testC-is-masked
测试
min
方法的返回值。出现这种情况时,意味着该批中的所有值都被屏蔽,因此该批对所有屏蔽数组的聚合最小值没有影响。

为了清晰起见,我肯定会将测试更改为“is MASK”。等值的定义如此普遍,这仍然让我感到困扰。蒙面看起来更像是一个什么都没有的概念,而不是一个什么都有的概念!
In [33]: masked is masked
Out[33]: True

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

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