如何为Xarray DataArray的已有维度添加新坐标?
给Xarray DataArray的已有维度添加新坐标的正确方法
嘿,我来帮你搞定这个问题~你遇到的错误是因为Xarray里loc的索引逻辑和pandas不一样,不能直接像pandas那样通过loc直接新增标签,得先把新的坐标标签添加到维度里再赋值,或者用拼接的方式实现。下面给你两种常用的正确做法:
方法一:用xr.concat拼接新的DataArray
这种方法适合你已经有对应新坐标的数据(这里是全0)的情况,步骤很清晰:
- 先创建一个和原数组
run、year维度匹配的新数组,对应要添加的c6坐标; - 用
concat把原数组和新数组在sim维度上拼接起来。
代码示例:
import numpy as np import xarray as xr # 你的原始代码 demo_results = np.zeros([10, 20, 5]) cols = ['c1', 'c2', 'c3', 'c4', 'c5'] t = xr.DataArray(demo_results, coords={'sim': cols}, dims=('run', 'year', 'sim')) # 创建对应c6的全0数组,维度匹配run和year new_sim_data = xr.DataArray(np.zeros([10, 20]), dims=('run', 'year')) # 给新数组指定sim坐标为c6,然后和原数组拼接 t_updated = xr.concat([t, new_sim_data.assign_coords(sim='c6')], dim='sim')
方法二:先扩展坐标再赋值
如果你只是想先把坐标加上,再填充值,这种方法更直接:
- 用
assign_coords扩展sim维度的坐标列表,添加c6; - 此时新坐标对应的位置会被自动填充为
NaN,再用loc给它赋值0即可。
代码示例:
# 扩展sim的坐标,添加c6 t_updated = t.assign_coords(sim=np.append(t.sim.values, 'c6')) # 给新的sim标签c6赋值0 t_updated.loc[:, :, 'c6'] = 0
为什么你的原始代码报错?
你写的t.loc['sim', 'c6'] = 0不符合Xarray的loc用法:Xarray的loc是按维度的标签值来索引,格式是loc[维度1标签, 维度2标签, ...],而不是先写维度名。就算你写成t.loc[:, :, 'c6'],也会报错,因为c6还不是sim维度里存在的标签,必须先把标签添加到维度中才能赋值。
验证一下结果,你可以打印t_updated.sim,就能看到sim维度已经包含c1到c6这6个坐标了,对应的数值也都是0哦~
内容的提问来源于stack exchange,提问作者krishnab
相关产品推荐
相关产品推荐

