如何用邻域单元格均值替换Xarray数据集特定经纬度的值?
解决Xarray替换特定经纬度单元格值的问题
问题根源
你之前的代码用了链式索引(ds.loc[...]['qtot']),这种操作返回的大概率是原数据集的副本而非视图,所以赋值只会修改副本,原数据集不会更新。Xarray的索引规则要求直接定位到目标变量进行赋值,避免链式索引。
解决方案
步骤1:计算邻域均值
先正确提取目标点的邻域范围,对经纬度维度求平均,得到仅含time维度的均值数组:
# 计算邻域的经纬度均值(保留time维度) neighborhood_mean = ds.loc[ {'lon': slice(lon - 0.5, lon + 0.5), 'lat': slice(lat + 0.5, lat - 0.5)} # 若lat维度是从北到南递减,需用此顺序 ]['qtot'].mean(dim=['lat', 'lon'])
注意:如果你的
lat维度是递增的(从南到北),把lat的slice改成slice(lat - 0.5, lat + 0.5)即可。
步骤2:直接赋值到原数据集
避免链式索引,用以下两种方式之一直接修改原数据集的qtot变量:
方式一:通过数据集的.loc定位变量
ds.loc[{'lon': lon, 'lat': lat}, 'qtot'] = neighborhood_mean
方式二:先定位变量再用.loc索引
ds['qtot'].loc[{'lon': lon, 'lat': lat}] = neighborhood_mean
额外注意事项
如果你的数据集是从文件读取的(未加载到内存),先执行ds = ds.load()把数据加载到内存后再修改,否则可能无法保存修改结果。
内容的提问来源于stack exchange,提问作者Ruben Calvo
相关产品推荐
相关产品推荐

