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

을 나는이 참조 실제로 : masked에 대한

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

테스트를 도움이되지 않습니다 여기에 내가하고 싶은거야

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

답변

3

필자는 가장 평범한 방법은 원하는 것을 수행 한 다음 전체 배열이 가면 발생하는 오류를 잡는 것이라고 생각한다. 예를 들어

는 :

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이면 Exception을 던지는 'numpy.min'에 빈 배열을 생성합니다. 괜찮은가요? – 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은 두 번째 부분으로'is np.ma.masked '를 사용하고 있습니다. – j08lue

관련 문제