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 min 呼び出しの結果が「マスク」されているかどうかをテストするだけでよい場合は、直接行うことができます。

>>> 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 に答える