我有一个应用程序从 netcdf 文件中读取 32 位浮点数据,其中使用了默认的 netcdf 填充值,即 9.96920996839e+36。在应用程序中的特定点,对从输入数据创建的 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,
菲尔