如何对xr.Dataset的坐标、维度及变量按字母顺序排序
解决方案
transpose()方法仅调整每个数据变量内部的维度轴顺序,不会修改Dataset顶层的维度、坐标列表排序,也不会调整数据变量的排列顺序。要实现完全的字母序排序,可按以下方法操作:
实现逻辑
- 按字母序排序维度列表,调整所有变量的内部维度顺序
- 按排序后的维度顺序重新指定坐标,修改Dataset顶层的坐标显示顺序
- 按字母序排序数据变量名称,调整变量展示顺序
完整可运行代码
import xarray as xr import numpy as np # 初始化示例Dataset ds = xr.Dataset( { 'z': (['c', 'a', 'b'], np.ones(shape=(2, 2, 2))), 'x': (['a', 'b', 'c'], np.zeros(shape=(2, 2, 2))), 'y': (['c'], [0, 1]), }, coords={'c': [30, 31], 'a': [10, 11], 'b': [20, 21]} ) # 生成排序后的维度、变量列表 sorted_dims = sorted(ds.dims) sorted_vars = sorted(ds.data_vars) # 构造排序后的Dataset ds_sorted = xr.Dataset( # 传入排序后的变量,同时完成每个变量的维度转置 {var: ds[var].transpose(*sorted_dims) for var in sorted_vars}, # 按排序后的顺序指定坐标 coords={dim: ds.coords[dim] for dim in sorted_dims} ) print(ds_sorted)
输出结果
<xarray.Dataset> Dimensions: (a: 2, b: 2, c: 2) Coordinates: * a (a) int64 10 11 * b (b) int64 20 21 * c (c) int64 30 31 Data variables: x (a, b, c) float64 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 y (c) int64 0 1 z (a, b, c) float64 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
简化写法
如果不需要拆分步骤,也可以直接用一行代码实现:
ds_sorted = xr.Dataset(ds, coords={d: ds[d] for d in sorted(ds.dims)})[sorted(ds.data_vars)].transpose(*sorted(ds.dims))
内容的提问来源于stack exchange,提问作者kit
相关产品推荐
相关产品推荐

