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
이 게시물에서 많은 것을 학습 : 나는 그것의 자신의 도메인 마스킹을 추가하지 않습니다 사용자 정의
log
을 정의 할 수처럼보인다. 솔직히이 문제를 해결할 방법이 없다고 생각했습니다. 또한 예제가'np.ma.log' 함수를 사용하고 있다는 것을주의하지 않고'np.log'로 테스트했지만 동일한 효과가 있습니다. 당신의'mylog'에 대한 정의에는 부작용이 있습니다. 나는 이것을 보여주고이를 피할 수있는 방법을 요청하도록 질문을 업데이트했다. – salotz