2017-05-03 1 views
2

저는 stackoverflow에서 얻은 도움 덕분에 마스크 된 배열을 사용하고 있지만 마스크 된 배열의 np.where 평가에 문제가 있습니다.np.where 및 마스크 된 배열

내 마스크 배열은 다음과 같은

m_pt0 = np.ma.masked_array([1, 2, 3, 0, 4, 7, 6, 5], 
          mask=[False, True, False, False, 
           False, False, False, False]) 

그리고 인쇄 :

In [24]: print(m_pt0) 
[1 -- 3 0 4 7 6 5] 

내가 m_pt0에서 인덱스를 찾고 있어요 어디 m_pt0 = 0, 내가 기대하는

np.where(0 == m_pt0) 

반환 :

(array([3])) 

그러나, 마스크에도 불구하고 (또는 때문에?), 내가 대신 마스크를 사용하는 전체 포인트는 "빈"입니다 인덱스에 접근하지 않도록하는 것입니다

(array([1, 3]),) 

을 얻을, 그래서 나는 어디에 어떻게 사용할 수 있습니다 (또는 다른 함수)를 사용하여 마스크를 해제하고 내 부울 조건과 일치하는 인덱스 만 검색합니다.

+0

'numpy.ma' 서브 모듈에서'ma.where()'를 시도 했습니까? 다른 결과가 나옵니까? – blubberdiblub

+0

전체 코드를 입력하십시오. 내가 조립 한 예에서는 모든 것이 예상대로 작동합니다. –

+3

'[1 - 3 0 4 7 6 5]'는 유효한 numpy 객체가 아닙니다. 당신이 말하는 진짜 대상은 무엇입니까? – Kasramvd

답변

4

마스크 된 변형 where() 함수를 사용해야합니다. 그렇지 않으면 마스크 된 배열에 대해 잘못된 결과 나 원치 않는 결과가 반환됩니다. polyfit()과 같은 다른 기능도 마찬가지입니다.

I. 전자는 :

In [2]: np.ma.where(0 == m_pt0) 
Out[2]: (array([3]),) 
+0

이것은 해결책이지만 이러한 행동으로 인해 [내 의견] (http://stackoverflow.com/questions/43761425/np-where-and-masked-array?noredirect=1#comment74565203_43761425)을 읽어보십시오. – Kasramvd

+0

@ Kasramvd 나는 그것이 그만큼 명확하지 않다고 생각하지 않습니다. 'np.polyfit()'또한 마스크 된 배열에 대해 제대로 작동하지 않으며 비교가 아닌 계산을 수행합니다. – blubberdiblub

+0

예, 일부 계산을 수행합니다. 그것은 여전히 ​​(피팅 다항식의 학위와 함께) 그것에 약간의 비교를 가지고 있지만 이것은 문서에서 버그라고 생각합니다. – Kasramvd

2

항등 테스트는 혼란을 만들 수 있습니다.

In [19]: 0 == m_pt0 
Out[19]: 
masked_array(data = [False -- False True False False False False], 
      mask = [False True False False False False False False], 
     fill_value = True) 

마스크 된 배열과 .data.mask 속성이 결과는 다른 마스크 배열이다.

In [20]: _.data 
Out[20]: array([False, True, False, True, False, False, False, False], dtype=bool) 

np.where는 2 True을보고하고, 함수의 np.ma 버전을 사용하는 것이 좋습니다 수

In [23]: np.where(0 == m_pt0) 
Out[23]: (array([1, 3], dtype=int32),) 
In [24]: np.where((0 == m_pt0).data) 
Out[24]: (array([1, 3], dtype=int32),) 

반환 : 인식 MA하지 numpy 기능은 바로이 .data

In [25]: np.ma.where(0 == m_pt0) 
Out[25]: (array([3], dtype=int32),) 

np.source(np.ma.where) 코드를 보면 알 수 있습니다.

if missing == 2: 
    return filled(condition, 0).nonzero() 
(plus lots of code for the 3 argument use) 

filled는 않습니다 :

In [27]: np.ma.filled((0 == m_pt0),0) 
Out[27]: array([False, False, False, True, False, False, False, False], dtype=bool) 

MA 기능은 자주 (이 경우 0) 무해한 뭔가 마스크 값을 교체하거나 고려에서 제거 할 compressed를 사용합니다.

In [36]: m_pt0.compressed() 
Out[36]: array([1, 3, 0, 4, 7, 6, 5]) 
In [37]: m_pt0.filled(100) 
Out[37]: array([ 1, 100, 3, 0, 4, 7, 6, 5]) 

numpy 함수는 작업을 배열 자체 메서드에 위임하면 MA에서 올바르게 작동합니다.

In [41]: np.nonzero(m_pt0) 
Out[41]: (array([0, 2, 4, 5, 6, 7], dtype=int32),) 
In [42]: m_pt0.nonzero() 
Out[42]: (array([0, 2, 4, 5, 6, 7], dtype=int32),) 
In [43]: np.where(m_pt0) 
Out[43]: (array([0, 1, 2, 4, 5, 6, 7], dtype=int32),) 

np.nonzero 대리인. np.where은 그렇지 않습니다.


마스크 된 어레이의 repr은 마스크를 나타낸다. 그 str은 마스크 된 데이터를 보여줍니다 :

In [31]: m_pt0 
Out[31]: 
masked_array(data = [1 -- 3 0 4 7 6 5], 
      mask = [False True False False False False False False], 
     fill_value = 999999) 
In [32]: str(m_pt0) 
Out[32]: '[1 -- 3 0 4 7 6 5]'