2012-06-03 97 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

相關問題