2012-06-03 98 views
3

如何测试是否在numpy的数组每一个元素都被屏蔽?这是我想做什么:如何测试是否在numpy的数组每一个元素都被屏蔽

x = #is a maksed numpy array 
masked_min = numpy.ma.min(x) 
if masked_min IS NOT A MASKED ELEMENT: 
    #do some stuff only if masked_min is a value 

在实践中我看到这一点:

>>> x = numpy.ma.array(numpy.array([1,2,3]),mask=[True,True,True]) 
>>> masked_min = numpy.ma.min(x) 
masked 

测试对于masked是无益的:

>>> numpy.ma.sum(x) == numpy.ma.masked 
masked 

回答

3

我认为最Python的方式将只是做你想要什么,再搭上导致如果整个阵列被屏蔽任何错误。

例如:

x = numpy.ma.array(numpy.array([1,2,3]),mask=[True,True,True]) 
try: 
    my_min = numpy.min(x[~x.mask]) 
    # Continue with my_min 
except ValueError: 
    # Bail or what have you 
    print 'Masks all around!' 
+0

@DSM,我不明白您的评论。这里〜x.mask被用作x的一个索引,但是如果所有的False产生一个空数组到'numpy.min',它抛出一个Exception。那不好吗? – Rich

+0

啊,那只是我无法阅读 - 我的眼睛正好通过'[〜x.mask]'。 – DSM

10

如果“测试,如果整个阵列在numpy的蒙面”你的意思是每个元素是否被屏蔽,因为面膜本身的数组,你可以使用.mask.all()

>>> x = numpy.ma.array(numpy.array([1,2,3]),mask=[True,True,True]) 
>>> x 
masked_array(data = [-- -- --], 
      mask = [ True True True], 
     fill_value = 999999) 

>>> x.mask 
array([ True, True, True], dtype=bool) 
>>> x.mask.all() 
True 

也许.count(),但那是轴依存。 OTOH如果你真的只需要测试你分钟调用的结果是否是“蒙面”,你能做到这一点直接:

>>> numpy.ma.min(x) 
masked 
>>> type(_) 
<class 'numpy.ma.core.MaskedConstant'> 
>>> isinstance(numpy.ma.min(x), numpy.ma.core.MaskedConstant) 
True 
>>> numpy.ma.min(x) is numpy.ma.masked 
True 

[可能有更简单的方法来做到这一点;我很少用蒙面阵列自己。]

+0

是的,我的意思是“每个元素是否被屏蔽”,我已经改变了我的问题的标题。 – Rich

+0

+1第二部分,展示了使用'是np.ma.masked' – j08lue

相关问题