xarray计算空间加权均值报TypeError: invalid type promotion错误
问题触发原因
- 权重生成逻辑有误:代码中使用全数据集的纬度坐标
ds.lat计算余弦权重,但待计算的olr已经裁剪为2°N-9°N的子区域,权重数组的坐标标签和olr的纬度维度不匹配 - 数据精度不匹配:netCDF中存储的OLR变量通常为float32类型,而numpy默认计算余弦值输出float64类型,xarray加权均值底层调用numpy einsum运算时,老版本不支持隐式跨精度类型提升,因此抛出
invalid type promotion错误
修复方案
调整权重计算逻辑,在完成空间、时间切片后,使用切片对应的纬度序列生成权重,同时将权重转换为和待计算变量一致的精度,修改后可直接在xarray内完成计算,无需调用外部cdo工具,修复后完整代码如下:
import xarray as xr import numpy as np min_lat = 2 max_lat = 9 datestr = "2017-03-10" olrfile = "olr-daily_v01r02_20170101_20171231.nc" ds = xr.open_dataset(olrfile) olr = ds.sel(lat=slice(min_lat, max_lat), time=datestr) # 基于裁剪后的纬度计算权重,同时对齐数据类型 weights = np.cos(np.deg2rad(olr.lat)).astype(olr.olr.dtype) olrw = olr.weighted(weights) olrm = olrw.mean(dim=('lat'))
注:如果需要批量计算多个子区域、多时间步的加权平均,只要保证权重由当前计算范围对应的纬度生成、且类型和目标变量一致,即可稳定运行,计算效率与cdo工具无显著差异。
内容的提问来源于stack exchange,提问作者ClimateUnboxed
相关产品推荐
相关产品推荐

