在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或者其他东西,因为我觉得这样会联系到这种内部类型类(我认为)。我可以通过小心测试!=来进行测试工作,因为那时任何其他有效数字都应该通过。但我觉得这很危险,因为如果倒置逻辑应该是正确的,并且考虑到这种行为,它不是。
我试图安全地积累很多不同的人。我无法加载它们,我需要结合部分聚合的结果。正是在这种组合中,我偶然发现了这一点。
答案 0 :(得分:0)
在您的代码中,numpy.ma.masked_array([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
如果实例(即__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
方法的返回值。发生这种情况时,表示此批次中的所有值都被屏蔽,因此该批次对所有屏蔽数组的聚合最小值没有影响。