You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对xr.Dataset的坐标、维度及变量按字母顺序排序

解决方案

transpose()方法仅调整每个数据变量内部的维度轴顺序,不会修改Dataset顶层的维度、坐标列表排序,也不会调整数据变量的排列顺序。要实现完全的字母序排序,可按以下方法操作:

实现逻辑

  1. 按字母序排序维度列表,调整所有变量的内部维度顺序
  2. 按排序后的维度顺序重新指定坐标,修改Dataset顶层的坐标显示顺序
  3. 按字母序排序数据变量名称,调整变量展示顺序

完整可运行代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:54:02