6

如何测试 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
4

2 回答 2

19

如果通过“测试整个数组是否在 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

[可能有更简单的方法来做到这一点;我自己很少使用掩码数组。]

于 2012-06-03T05:09:41.467 回答
3

我认为最 Pythonic 的方法是只做你想做的事,然后捕获如果整个数组被屏蔽而导致的任何错误。

例如:

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!'
于 2012-06-03T05:14:17.133 回答