__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
原来的方法不起作用,因为不清楚 coordA
和 coordB
应该是 MultiIndex 的两个部分,还是 non-indexed 坐标。
这有意义吗?有什么可以做得更好的反馈吗?
当 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
原来的方法不起作用,因为不清楚 coordA
和 coordB
应该是 MultiIndex 的两个部分,还是 non-indexed 坐标。
这有意义吗?有什么可以做得更好的反馈吗?