2017-10-27 4 views
1

을 마스크 제공 :조작은 잘못된 값이 NumPy와 <a href="https://docs.scipy.org/doc/numpy/reference/maskedarray.generic.html#operations-on-masked-arrays" rel="nofollow noreferrer">operations on numpy arrays</a>에서 마스크 배열에 대한 설명서에서

numpy.ma 모듈은 대부분의 ufuncs의 특정 구현되어 있습니다. 예 : 입력이 마스크 또는 유효성 도메인 밖에 할 때마다 (예 : 로그 또는 분할 등) 유효 도메인이 단항 및 바이너리 기능은 마스크 상수를 반환

ma.log([-1, 0, 1, 2]) 
masked_array(data = [-- -- 0.0 0.69314718056], 
      mask = [ True True False False], 
     fill_value = 1e+20) 

나는 문제가에 대한 나의 계산 그 잘못된 연산이 어디서 발생했는지 알아야합니다. 구체적으로 내가 대신 싶습니다 :이 질문의 위험에서

ma.log([-1, 0, 1, 2]) 
masked_array(data = [np.nan -- 0.0 0.69314718056], 
      mask = [ True True False False], 
     fill_value = 1e+20) 

을 내 주요 질문 대화되는 것은 :

얻을 수있는 좋은 해결책이 무엇 계산 된 유효하지 않은 값이 (사람들은 "고정"이 masked_array by fix_invalid, np.nan 및 np.inf와 같이) 마스크 된 값으로 전환되지 않습니다 (및 충돌됩니다)?

현재의 해결책은 masked_array.data에서 함수를 계산 한 다음 원래 마스크로 마스크 된 배열을 재구성하는 것입니다. 그러나, 나는 임의의 함수를 사용자로부터 많은 다른 배열에 매핑하는 응용 프로그램을 작성 중입니다. 일부는 마스크가 적용되고 일부는 그렇지 않습니다. 마스크 배열에 대한 특수 처리기를 피하기 위해 찾고 있습니다. 또한 이러한 배열은 MISSING, NaN 및 Inf를 구분하여 중요하므로 masked 대신 np.nan을 사용하는 배열을 사용할 수 없습니다.


또한이 동작이 왜 발생하는지에 대한 견해가 있으면 누구나 알고 싶습니다. 마스크되지 않은 값에 대한 작업 결과의 유효성은 실제로 사용자의 책임이므로 fix_invalid 함수를 사용하여 "정리"할 수 있으므로 동일한 작업에서이 작업을 수행하는 것이 이상해 보입니다.

numpy에서 누락 된 값의 진도에 대해 아는 사람이 있다면 가장 큰 숫자 인 posts은 2011-2012에서 가장 오래된 것으로 공유하십시오. 결과적으로 결코 논란의 여지가없는 토론이있었습니다.


편집 : 2017년 10월 30일

이 hpaulj의 대답에 추가 할; 수정 된 도메인을 갖는 로그 함수의 정의는 numpy 네임 스페이스에서 로그의 동작에 부작용을 미친다.

In [1]: import numpy as np 

In [2]: np.log(np.ma.masked_array([-1,0,1,2],[1,0,0,0])) 
/home/salotz/anaconda3/bin/ipython:1: RuntimeWarning: divide by zero encountered in log 
    #!/home/salotz/anaconda3/bin/python 
/home/salotz/anaconda3/bin/ipython:1: RuntimeWarning: invalid value encountered in log 
    #!/home/salotz/anaconda3/bin/python 
Out[2]: 
masked_array(data = [-- -- 0.0 0.6931471805599453], 
      mask = [ True True False False], 
     fill_value = 1e+20) 

In [3]: mylog = np.ma.core._MaskedUnaryOperation(np.core.umath.log) 

In [4]: np.log(np.ma.masked_array([-1,0,1,2],[1,0,0,0])) 
/home/salotz/anaconda3/bin/ipython:1: RuntimeWarning: divide by zero encountered in log 
    #!/home/salotz/anaconda3/bin/python 
/home/salotz/anaconda3/bin/ipython:1: RuntimeWarning: invalid value encountered in log 
    #!/home/salotz/anaconda3/bin/python 
Out[4]: 
masked_array(data = [-- -inf 0.0 0.6931471805599453], 
      mask = [ True False False False], 
     fill_value = 1e+20) 

np.log 지금 mylog과 같은 동작을하지만, np.ma.log는 변경되지 않습니다 :이 문제를 방지 할 수있는 방법이

In [5]: np.ma.log(np.ma.masked_array([-1,0,1,2],[1,0,0,0])) 
Out[5]: 
masked_array(data = [-- -- 0.0 0.6931471805599453], 
      mask = [ True True False False], 
     fill_value = 1e+20) 

있습니까?Python 3.6.2 :: Anaconda custom (64-bit)와 NumPy와 사용

1.12.1

답변

3

그냥 보이는 것을 명확히 인수에

np.ma.log 실행을 여기 np.log 일 수 있지만 경고 트랩 :

In [26]: np.log([-1,0,1,2]) 
/usr/local/bin/ipython3:1: RuntimeWarning: divide by zero encountered in log 
    #!/usr/bin/python3 
/usr/local/bin/ipython3:1: RuntimeWarning: invalid value encountered in log 
    #!/usr/bin/python3 
Out[26]: array([  nan,  -inf, 0.  , 0.69314718]) 

이의 마스크 nan-inf 값입니다. 그리고 분명히 사본이 data 슬롯에 원래 값 :

In [27]: np.ma.log([-1,0,1,2]) 
Out[27]: 
masked_array(data = [-- -- 0.0 0.6931471805599453], 
      mask = [ True True False False], 
     fill_value = 1e+20) 
In [28]: _.data 
Out[28]: array([-1.  , 0.  , 0.  , 0.69314718]) 

(Py3에서 실행; NumPy와 버전 1.13.1)는

이 마스킹 동작은 ma.log에 고유하지 않습니다. 그것은이 filldomain 속성으로 정의된다 np.ma.core에서

In [41]: type(np.ma.log) 
Out[41]: numpy.ma.core._MaskedUnaryOperation 

의 클래스에 의해 결정됩니다

log = _MaskedUnaryOperation(umath.log, 1.0, 
         _DomainGreater(0.0)) 
그래서

유효한 도메인은 (가면)> 0 :

In [47]: np.ma.log.domain([-1,0,1,2]) 
Out[47]: array([ True, True, False, False], dtype=bool) 

그 도메인 마스크는 or-ed이고

입니다.

같은 값을 가지고 있습니다. 덕분에

In [58]: mylog = np.ma.core._MaskedUnaryOperation(np.core.umath.log) 
In [59]: mylog([-1,0,1,2]) 
Out[59]: 
masked_array(data = [  nan  -inf 0.   0.69314718], 
      mask = False, 
     fill_value = 1e+20) 

In [63]: np.ma.masked_array([-1,0,1,2],[1,0,0,0]) 
Out[63]: 
masked_array(data = [-- 0 1 2], 
      mask = [ True False False False], 
     fill_value = 999999) 
In [64]: np.ma.log(np.ma.masked_array([-1,0,1,2],[1,0,0,0])) 
Out[64]: 
masked_array(data = [-- -- 0.0 0.6931471805599453], 
      mask = [ True True False False], 
     fill_value = 1e+20) 
In [65]: mylog(np.ma.masked_array([-1,0,1,2],[1,0,0,0])) 
Out[65]: 
masked_array(data = [-- -inf 0.0 0.6931471805599453], 
      mask = [ True False False False], 
     fill_value = 1e+20) 
+0

이 게시물에서 많은 것을 학습 : 나는 그것의 자신의 도메인 마스킹을 추가하지 않습니다 사용자 정의 log을 정의 할 수처럼

보인다. 솔직히이 문제를 해결할 방법이 없다고 생각했습니다. 또한 예제가'np.ma.log' 함수를 사용하고 있다는 것을주의하지 않고'np.log'로 테스트했지만 동일한 효과가 있습니다. 당신의'mylog'에 대한 정의에는 부작용이 있습니다. 나는 이것을 보여주고이를 피할 수있는 방법을 요청하도록 질문을 업데이트했다. – salotz