如何使用assign方法为xarray.Dataset添加具有相同time、latitude、longitude维度的新变量
如何使用assign方法为xarray.Dataset添加具有相同time、latitude、longitude维度的新变量
我来帮你搞定这个问题~你遇到的问题其实是因为直接把numpy数组传给assign时,xarray没办法自动识别它应该对应原Dataset里的哪些维度,所以才会生成新的band、x、y维度,和原数据集的维度不匹配。
咱们可以通过先把rgi_raster包装成和原Dataset维度对齐的xarray.DataArray,再添加进去,具体步骤如下:
方法一:先创建匹配维度的DataArray,再广播到time维度
因为你的rgi_raster形状是(1, 360, 720),其中第一个维度是多余的band维度,咱们先把它去掉,然后绑定原Dataset的latitude和longitude坐标,最后广播到整个time维度(这样每个时间点都会复用这个raster的数据):
import xarray as xr # 第一步:去掉rgi_raster中多余的band维度,得到(360, 720)的数组 rgi_clean = rgi_raster.squeeze() # 第二步:创建和原Dataset维度匹配的DataArray rgi_da = xr.DataArray( rgi_clean, dims=["latitude", "longitude"], # 指定和原数据集一致的维度名 coords={ "latitude": ds2.latitude, "longitude": ds2.longitude } ) # 第三步:把DataArray广播到和Glacier变量相同的维度(自动扩展time维度),然后添加到Dataset ds2["rgi_raster"] = rgi_da.broadcast_like(ds2.Glacier)
方法二:用assign的lambda写法一步完成
如果你想更简洁,也可以直接在assign里用lambda函数处理:
ds2 = ds2.assign( rgi_raster=lambda ds: xr.DataArray( rgi_raster.squeeze(), dims=["latitude", "longitude"], coords={"latitude": ds.latitude, "longitude": ds.longitude} ).broadcast_like(ds.Glacier) )
为什么之前的方法不行?
直接传入numpy数组时,xarray无法推断这个数组对应的维度信息,所以会默认给它创建新的维度(比如band、x、y),而不会复用原Dataset已有的latitude、longitude和time维度。通过手动创建DataArray并绑定坐标,我们就能告诉xarray该如何对齐维度啦。
备注:内容来源于stack exchange,提问作者user5618251
相关产品推荐
相关产品推荐

