__init__ 中的多索引 DataArray

multi-index DataArray in __init__

当 DataArrays 是用同一维度的多个坐标创建时,它们不会自动索引它们的坐标,即以下不起作用:

d = DataArray([0], coords={'coordA': ('dim', [0]), 'coordB': ('dim', [0])}, dims=['dim'])
d.sel(coordA=0)  # ValueError: dimensions or multi-index levels ['coordA'] do not exist

这是因为未创建 MultiIndex * dim: [coordA, coordB]

有没有办法在创建 DataArray 时自动创建 MultiIndex?

我们可以在创建对象后创建索引,但是在很多地方创建DataArrays时,这会非常麻烦。

d = d.set_index(dim=['coordA', 'coordB'], append=True)
d.sel(coordA = 0)  # works

在 xarray 0.13 之前,可以覆盖 DataArray.__init__ 方法并就地设置索引,但是 inplace now raises an error.

class DataAssembly(DataArray):
    def __init__(self, *args, **kwargs):
        super(DataAssembly, self).__init__(*args, **kwargs)
        self.set_index(dim=['coordA', 'coordB'], append=True, inplace=True)  # no longer works since 0.13

我想你可以通过将 MultiIndex 传递给坐标来得到你想要的东西:

In [30]: idx = pd.MultiIndex.from_arrays([[0], [0]], names=['cA', 'cB'])

In [28]: d = xr.DataArray([0], dims=['dim'], coords=dict(dim=idx))

In [29]: d
Out[29]:
<xarray.DataArray (dim: 1)>
array([0])
Coordinates:
  * dim      (dim) MultiIndex
  - cA       (dim) int64 0
  - cB       (dim) int64 0


In [31]: d.sel(cA=0)
Out[31]:
<xarray.DataArray (cB: 1)>
array([0])
Coordinates:
  * cB       (cB) int64 0

原来的方法不起作用,因为不清楚 coordAcoordB 应该是 MultiIndex 的两个部分,还是 non-indexed 坐标。

这有意义吗?有什么可以做得更好的反馈吗?