为什么netCDF提取的两个数组合并后最大值远高于单个数组?
问题原因分析
- 最核心的原因是netCDF变量自带的缺省填充值被纳入了最大值统计,你看到的
9.96921e+36是气象、地学领域netCDF文件通用的标准浮点型缺测值(符合CF数据规范)。 - 你单独对
m、n计算最大值时得到正常结果,是因为从netCDF中读取的数组默认是numpy.ma.MaskedArray(掩码数组),调用max()方法时会自动忽略被标记为缺测的位置;而你使用np.dstack/np.concatenate拼接普通numpy数组时,掩码信息会丢失,原本被掩盖的缺测大值会直接保留在拼接后的数组中,统计最大值时就会返回这个缺测值。
验证方法
你可以执行以下代码确认问题:
# 查看m的类型是否为掩码数组 print(type(m)) # 直接查看m原始数据的最大值,看是否已经存在9.96921e+36 print(m.data.max())
如果原始数据里已经存在这个极大值,就可以确认是填充值的问题。
解决方法
方法1:使用掩码数组专属的拼接方法
用np.ma.dstack代替普通的np.dstack,拼接后仍保留掩码信息,统计最大值时会自动跳过缺测值:
d = np.ma.dstack((m, n)) max_d = d.max()
方法2:将缺测值替换为NaN后处理
拼接前先把填充值替换为np.nan,后续使用np.nanmax统计最大值即可:
# 获取变量的填充值 fill_value = ds1.variables['swvl1']._FillValue # 替换缺测值为NaN m[m == fill_value] = np.nan n[n == fill_value] = np.nan # 拼接 d = np.dstack((m, n)) # 计算忽略NaN的最大值 max_d = np.nanmax(d)
内容的提问来源于stack exchange,提问作者USer555
相关产品推荐
相关产品推荐

