デフォルトのnetcdfフィル値(9.96920996839e + 36)が使用されているnetcdfファイルから32ビット浮動小数点データを読み取るアプリケーションがあります。アプリの特定のポイントで、基本的なスケーリング(乗算)操作が、入力データから作成されたfloat32タイプのマスクされた配列に対して実行されます。
x = marr * scale # or, equivalently, x = ma.multiply(marr,scale)
この操作では、「乗算でオーバーフローが発生しました」という警告がスローされます。これは、おそらく、塗りつぶしの値とスケールの積が32ビット浮動小数点の最大値を超えているためです。マスクされた配列の他の値は小さいことがわかっています。問題は、なぜnumpyが入力配列のマスクされた要素の積を計算するのかということです。確かに、これらは単に無視されるべきですよね?
たまたま、出力配列の対応する値にはまだマスクされたフラグが付けられているため、警告は黙って無視できます。しかし、これがnumpyのバグなのか、「設計どおりに機能している」のかを知ることは興味深いでしょう。
以下のコードフラグメントは、この動作を示しています。
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
予想されるように、マスクされた配列がfloat64型の場合、オーバーフロー警告は表示されません(ただし、スケール係数が十分に大きい場合は表示されます)。同様に、float32の場合に-1.0e20などの小さい塗りつぶし値を使用すると、警告は消えます。
一見すると、大きいフィル値が使用されている場合(32ビットfp値の最大値に非常に近い)、numpyはマスクされた値を識別できないように見えます。
TIA、
フィル