2017-02-22 11 views
2

numpy.ma.masked_array()로 만든 마스크 된 배열에서 numpy.median()의 동작과 관련된 질문이 있습니다.마스크 된 배열에서 numpy.median의 예기치 않은 동작

은 내가 내 자신의 코드를 디버깅에서 이해 한 것처럼, numpy.median는()

대답 제공 (문제의 정의 Using numpy.median on a masked array 참조) 마스크 배열에서 예상대로 작동하지 않습니다이었다

설명 : 올바르게 기억하면 np.median은 하위 클래스를 지원하지 않으므로 np.ma.MaskedArray에서 올바르게 작동하지 않습니다.

결론적으로 마스크 된 배열에서 요소의 중앙값을 계산하려면이 배열이 마스크 된 배열에 대한 중간 함수이기 때문에 numpy.ma.median()을 사용해야합니다.

내 문제는이 문제를 알 수있는 방법이 없기 때문에이 문제를 찾는 데 상당한 시간을 투자했기 때문입니다.

numpy.median()을 통해 마스크 된 배열의 중앙값을 계산할 때 경고 또는 예외가 발생하지 않습니다.

이 함수가 반환하는 대답은 예상 한 내용이 아니므로 사람이이 기능을 인식하지 못하면 심각한 문제가 발생할 수 있습니다.

버그로 간주 될 수있는 사람은 누구입니까?

내 의견으로는 마스크 된 배열에서 numpy.median을 사용하면 예외가 발생하고 일종의 예외가 발생해야합니다.

모든 의견 ???

은 아래의 테스트 스크립트 마스크 배열 에 numpy.median 이용한 불필요한 예기치 않은 동작을 나타낸다 (유효 요소의 정확한 예상 중앙값 2.5주의!)을 :

In [1]: import numpy as np 

In [2]: test = np.array([1, 2, 3, 4, 100, 100, 100, 100]) 

In [3]: valid_elements = np.array([1, 1, 1, 1, 0, 0, 0, 0], dtype=np.bool) 

In [4]: testm = np.ma.masked_array(test, ~valid_elements) 

In [5]: testm 
Out[5]: 
masked_array(data = [1 2 3 4 -- -- -- --], 
      mask = [False False False False True True True True], 
     fill_value = 999999) 

In [6]: np.median(test) 
Out[6]: 52.0 

In [7]: np.median(test[valid_elements]) 
Out[7]: 2.5 

In [8]: np.median(testm) 
Out[8]: 4.0 

In [9]: np.ma.median(testm) 
Out[9]: 2.5 
+0

그래서 'np.median'은 작동하지 않지만'np.ma.median'는 작동합니까? – Eric

+0

일종의 ... 내 불만은 그것이 마스크 된 배열에 적용될 때 np.median이 잘못된 결과를 준다는 어떠한 표시도 (문서에서도 아님) 제공하지 않는다는 것입니다. 나를 위해 개인적으로, 때로는 아주 엉성한,이 잘못된 np.median 값은 발견되지 않을 것입니다. 그러므로, np.median은 작동하지 않지만 np.median은 마스크 된 배열에서 잘못된 결과를 표시하지 않습니다. –

+0

마스크 된 배열에서'np. *'함수가 많이 작동하지 않습니다. 문제는'np. * '함수는 가면 배열이 있는지조차 모르고있다. – Eric

답변

3

버그로 간주 될 수있는 사람은 누구입니까?

글쎄, 그것은 버그입니다! 나는 몇 달 전에 이슈 트래커()에 게시했다.

np.medianpartition 입력 배열의 메서드를 사용하지만 np.ma.MaskedArray 메서드는 partition 메서드보다 우선합니다. 그래서 arr.partitionnp.median에서 호출되면, 기본으로는 numpy.ndarray.partition 메쏘드가 기본값으로 사용됩니다 (마스크 된 배열에서는 위조입니다).