我有一个应用程序正在从netcdf文件中读取32位浮点数据,其中使用了默认的netcdf填充值,即9.96920996839e + 36。在应用中的一个特定点处的基本缩放(乘)操作从输入数据产生的FLOAT32型掩蔽阵列上执行,因此:在numpy的屏蔽阵列上执行乘法运算时出现溢出警告
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位f.p.值的最大值)时,numpy似乎无法识别掩码值。
TIA,
菲尔
感谢您的及时响应。是的,我发现了seterr函数提供的选项,尽管大概只是确定遇到数字错误时要采取的行动。正如你所建议的,可能是一个错误。 – Phil