将 1d 索引的 xarray 变量转换为 3D 坐标

Turn 1d-indexed xarray variables into 3D coordinates

我有一个 xarray.Dataset 大致如下所示:

<xarray.Dataset>
Dimensions:           (index: 286720)
Coordinates:
  * index             (index) int64 0 1 2 3 4 ... 286716 286717 286718 286719
Data variables:
    Time              (index) float64 2.525 2.525 2.525 ... 9.475 9.475 9.475
    ch                (index) int64 1 1 1 1 1 1 1 1 1 1 ... 2 2 2 2 2 2 2 2 2 2
    pixel             (index) int64 1 2 3 4 5 6 ... 1020 1021 1022 1023 1024
    Rough_wavelength  (index) float64 2.698 2.701 2.704 ... 32.05 32.05 32.06
    Count             (index) int64 463 197 265 335 305 ... 285 376 278 0 278

Time 变量只有 140 个唯一值,ch(...annel) 有 2 个唯一值,pixel 值有 1024 个。因此,我想将它们变成坐标并完全删除基本上不相关的 index 坐标,如下所示:

<xarray.Dataset>
Dimensions:           (Time: 140, ch: 2, pixel: 1024)
Coordinates:
    Time              (time) float64 2.525 ... 9.475
    ch                (ch) int64 1 2
    pixel             (pixel) int64 1 2 3 4 5 6 ... 1020 1021 1022 1023 1024
Data variables:
    Rough_wavelength  (time, ch, pixel) float64 2.698  ... 32.06
    Count             (time, ch, pixel) int64 463  ...  278

有没有办法使用 xarray 来做到这一点?如果不是,使用标准 numpy 堆栈的明智方法是什么?

pd.MultiIndex, then unstack索引替换index坐标:

In [10]: ds.assign_coords(
    ...:     {
    ...:         "index": pd.MultiIndex.from_arrays(
    ...:             [ds.Time.values, ds.ch.values, ds.pixel.values],
    ...:             names=["Time", "ch", "pixel"],
    ...:         )
    ...:     }
    ...: ).drop_vars(["Time", "ch", "pixel"]).unstack("index")