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