【问题标题】:multi-index DataArray in __init____init__ 中的多索引 DataArray
【发布时间】:2020-10-23 04:11:22
【问题描述】:

当使用相同维度的多个坐标创建 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

【问题讨论】:

    标签: python python-xarray


    【解决方案1】:

    我认为您可以通过将 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 的两个部分,还是非索引坐标。

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

    【讨论】:

    • 谢谢你的作品!我修改了 __init__ 以自动收集索引并通过坐标传递它们,就像你展示的那样。 xarray 的主要观点是数据元数据,坦率地说,我希望元数据总是被索引。我没有看到非索引的用例(目前序列化为 netcdf 除外)。
    • 如果我理解正确 - 2 元组 MultiIndex 和两个 1D 坐标之间存在概念上的差异 - 在一种情况下,点由 2 元组定义,在另一种情况下,点被定义仅由一个(或两者都不)坐标。
    猜你喜欢
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2020-10-26
    • 2019-01-18
    • 2019-01-03
    • 2021-09-07
    • 1970-01-01
    相关资源
    最近更新 更多