如何用sel修改xarray值?大/小xarray重叠区域赋值失败求助
问题描述
我有一个覆盖南美洲区域的大型xarray Dataset(包含x、y坐标),另有一个完全处于其范围内的小型xarray Dataset(坐标完全匹配),需要将大型xarray重叠区域的变量替换为小型xarray的对应变量。
两个xarray的结构如下:
小型xarray(待替换数据源)
<xarray.Dataset> Dimensions: (band: 1, x: 864, y: 868) Coordinates: - band (band) int64 1 - x (x) float64 -80.65 -80.65 -80.64 ... -73.48 -73.47 -73.46 - y (y) float64 0.8708 0.8625 0.8542 ... -6.337 -6.346 -6.354 spatial_ref int64 ... Data variables: band_data (band, y, x) float32 nan nan nan nan ... 112.0 112.1 112.2
大型xarray(目标更新数组)
<xarray.Dataset> Dimensions: (band: 1, x: 7080, y: 8640) Coordinates: - band (band) int64 1 - x (x) float64 -87.0 -86.99 -86.98 -86.97 ... -28.02 -28.01 -28.0 - y (y) float64 17.0 16.99 16.98 16.97 ... -54.98 -54.99 -55.0 spatial_ref int64 0 Data variables: band_data (band, y, x) float64 500.0 500.0 500.0 ... 500.0 500.0 500.0
执行以下代码后无报错,但大型xarray(array_500)未更新,求可行替代方法:
# array_500 是大型xarray # e_voronoi_raster[1] 是小型xarray(存储在列表中,取索引1) array_500.sel(x = e_voronoi_raster[1]["x"], y= e_voronoi_raster[1]["y"], method="nearest")["band_data"].data = e_voronoi_raster[1]["band_data"].data
解决方案
你的代码无效是因为sel返回的是原数组的副本(而非视图),直接修改.data不会影响原array_500。以下是两种可靠实现方式:
方法1:使用loc定位直接赋值
利用坐标直接定位大型数组的重叠区域,完成赋值:
# 提取小型数组的坐标 small_x = e_voronoi_raster[1].x small_y = e_voronoi_raster[1].y # 定位大型数组对应区域并替换值 array_500.loc[dict(x=small_x, y=small_y, band=1)] = e_voronoi_raster[1]["band_data"]
方法2:使用where批量替换
通过条件判断,将大型数组中属于小型数组范围的部分替换为对应值:
# 将小型数组重索引到大型数组的网格(坐标完全匹配时可跳过,此步兼容微小坐标偏差) small_data_reindexed = e_voronoi_raster[1]["band_data"].reindex_like(array_500["band_data"]) # 替换:当小型数组有有效值时,用它覆盖大型数组对应位置 array_500["band_data"] = array_500["band_data"].where(small_data_reindexed.isnull(), small_data_reindexed)
注意事项
- 若坐标完全精确匹配,方法1效率更高,直接定位赋值即可;
- 若存在微小坐标偏差,方法2的
reindex_like会自动对齐网格,确保替换准确; - 需确保两个数组的维度匹配(此处
band维度均为1,无需额外处理)。
内容的提问来源于stack exchange,提问作者user8044707
相关产品推荐
相关产品推荐

