2012-09-20 7 views
4

기본 netcdf 채우기 값이 사용되는 netcdf 파일 (예 : 9.96920996839e + 36)에서 32 비트 부동 소수점 데이터를 읽는 응용 프로그램이 있습니다. 응용 프로그램에서 특정 지점에 기초 스케일링 (곱셈) 동작에 따라서, 상기 입력 데이터로부터 생성 된 float32 형 마스크 어레이상에서 수행된다 :numpy 마스크 배열에 곱셈을 수행 할 때 오버플로 경고가 발생합니다.

x = marr * scale # or, equivalently, x = ma.multiply(marr,scale) 

이 조작은 아마도 경고 '곱셈에서 발생한 오버플'을 던진다 채우기 값과 스케일의 곱이 32 비트 부동 소수점의 최대 값을 초과하기 때문입니다. 마스크 된 배열의 다른 값은 작다고 알려져 있습니다. 그렇다면 numpy는 입력 배열에서 마스크 된 요소에 대해 제품을 계산하는 이유는 무엇입니까? 분명히 이것들은 단순히 무시되어야합니다. 맞습니까?

출력 배열의 해당 값이 마스크 된 것으로 표시되기 때문에 경고가 자동으로 무시 될 수 있습니다. 그러나 이것이 numpy 또는 '설계된대로 작동하는'버그인지 아는 것은 흥미로울 것입니다.

아래 코드 단편은 이러한 동작을 보여줍니다. 마스크 배열 (아마도 그것은 스케일 팩터가 충분히 크다한다면 비록) 형 float64의 경우

으로 예상 될 수

import numpy as np 
import numpy.ma as ma 
arr = [9.96920996839e+36, 1.123, 2.345, 9.96920996839e+36] 
marr = ma.masked_values(np.array(arr, dtype='float32'), 9.96920996839e+36) 
x = marr * 128.0 
는 오버 플로우 경고가 표시되지 않습니다. 마찬가지로 더 작은 채우기 값 (예 : -1.0e20은 float32의 경우에 사용됩니다.

더 큰 채우기 값을 사용할 때 numpy는 마스크 된 값을 식별 할 수없는 것처럼 보입니다 (이는 32 비트 f.p 값의 최대 값에 매우 가깝습니다).

TIA,
필 아마

답변

1

버그. 이전 라인이 있습니다

np.seterr(divide='ignore', invalid='ignore') 

이 값을 0 또는 NaN이의 마스크를 처리 할 수 ​​있도록 설계하지만, 매우 큰 아니에요을 나타냅니다. 큰 마스크 값을 처리하는데도

np.seterr(divide='ignore', invalid='ignore', over='ignore') 

이어야합니다.

일반적으로 numpy.ma 작업은 마스크 된 값을 포함하여 배열의 모든 값에서 작동합니다. 이것은 아마도 효율성과 방송 문제 때문일 것입니다.

+0

신속한 답변을 보내 주셔서 감사합니다. 네, 아마도 seterr 함수에 의해 제공되는 옵션을 발견 했겠지만, 아마도 이것들은 단순히 숫자 오류가 발생할 때 취해야 할 조치를 결정할뿐입니다. 당신이 제안하는대로, 아마 버그. – Phil

2

그러면 입력 배열의 마스크 된 요소에 대해 numpy가 제품을 계산하는 이유는 무엇입니까? 분명히 이것들은 단순히 무시되어야합니다. 맞습니까?

아아, 아니. 현재 구현에서는 전체 배열 배열에 모든 연산을 적용한 다음 마스크를 다시 적용합니다.

나는 그것이 비생산적인 것으로 들리지만 다른 방법보다 강력하고 비효율적 인 대안이라고 생각합니다. 처음에는 적절한 도메인에서만 작업을 적용하는 것이 좋겠지 만 해당 도메인의 계산은 매우 까다로울 수 있습니다 (pow과 관련된 몇 가지 큰 문제가 있음). 더욱이, 여분의 테스트는 이미 불쌍한 공연을 추락 시켰을 것이다.

numpy 함수가 선택적인 인수 where을 수락하는 새로운 방법이 최근에 도입되었습니다. 그게 도움이 될 수 있습니다 ... 그러나 C 수준에서 직접 누락/무시 된 값에 대한 지원을 소개하는 방법에 대한 회담도 있습니다. 가야 할 길입니다.

+0

'두포 (Hood)'에서 일어나는 일에 대한 추가 통찰력에 대해 많은 감사를드립니다. 이것을 알면 적절한 방어 코딩을 적용 할 수 있습니다. – Phil

+0

@Phil 저를 신뢰하십시오,'np.ma'는 오히려 clunky이고 느리고 개선이 절실히 필요합니다. 아이디어를 보내거나 메일 링리스트에서 요청하십시오 (또는 채팅으로 메시지를 삭제하십시오). 그러나 그것은 효과적이다. 킨다. –

관련 문제