首页 > 解决方案 > 如何对 xr.Dataset 的坐标和变量进行排序

问题描述

我想Dataset按字母顺序对 xarray 的坐标和变量进行排序。我曾尝试使用ds.transpose(*sorted(ds.dims)). 这似乎对 中每个的坐标/尺寸进行排序DataArrayDataset而不是对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]}
... )
    
>>> ds.transpose('a', 'b', 'c')
<xarray.Dataset>
Dimensions:  (c: 2, a: 2, b: 2)
Coordinates:
  * c        (c) int64 30 31
  * a        (a) int64 10 11
  * b        (b) int64 20 21
Data variables:
    z        (a, b, c) float64 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
    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

预期的行为是整体的坐标和尺寸xr.Dataset将被排序为'a', 'b', 'c'。但是,您可以看到只有数据变量本身的维度是按此顺序排列的。

如何对数据集的坐标和变量进行排序,而不仅仅是数组维度?

任何帮助都非常感谢,谢谢!

标签: pythonpython-xarray

解决方案


xr.Dataset.reindex_like您可以使用和在 xarray 中执行此操作xr.Dataset.reindex。如果您有另一个要匹配的对象,前者会很有帮助。

ds = xr.Dataset(
data_vars={
'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]}
)

current_indexes = ds.indexes
desired_order = ['a', 'b', 'c']
reordered_indexes = {index_name: current_indexes[index_name] for index_name in desired_order}
reordered_ds = ds.reindex(reordered_indexes)
>>> ds
<xarray.Dataset>
Dimensions:  (c: 2, a: 2, b: 2)
Coordinates:
  * c        (c) int64 30 31
  * a        (a) int64 10 11
  * b        (b) int64 20 21
Data variables:
    z        (c, a, b) float64 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
    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
>>> reordered_ds
<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:
    z        (c, a, b) float64 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
    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

推荐阅读