【问题标题】:Remove a dimension from some variables in an xarray Dataset从 xarray 数据集中的某些变量中删除维度
【发布时间】:2017-01-24 18:21:52
【问题描述】:

我有一个 xarray 数据集,其中一些变量的维度超出了必要的范围(例如,一个 3D 数据集,其中“纬度”和“经度”变量也随时间变化)。如何删除多余的尺寸?

例如,在下面的数据集中,“bar”是沿xy 轴的二维变量,沿x 轴具有恒定值。如何从“bar”而不是“foo”中删除 x 维度?

>>> ds = xr.Dataset({'foo': (('x', 'y'), np.random.randn(2, 3))},
                    {'x': [1, 2], 'y': [1, 2, 3],
                     'bar': (('x', 'y'), [[4, 5, 6], [4, 5, 6]])})
>>> ds
<xarray.Dataset>
Dimensions:  (x: 2, y: 3)
Coordinates:
  * x        (x) int64 1 2
  * y        (y) int64 1 2 3
    bar      (x, y) int64 4 5 6 4 5 6
Data variables:
    foo      (x, y) float64 -0.9595 0.6704 -1.047 0.9948 0.8241 1.643

【问题讨论】:

    标签: python python-xarray


    【解决方案1】:

    删除额外维度的最直接方法(使用索引)会导致稍微令人困惑的错误消息:

    >>> ds['bar'] = ds['bar'].sel(x=1)
    ValueError: dimension 'x' already exists as a scalar variable
    

    问题在于,当您在 xarray 中进行索引时,它会将索引坐标保持为标量坐标:

    >>> ds['bar'].sel(x=1)
    <xarray.DataArray 'bar' (y: 3)>
    array([4, 5, 6])
    Coordinates:
        x        int64 1
      * y        (y) int64 1 2 3
        bar      (y) int64 4 5 6
    

    这通常很有用,但在这种情况下,当您尝试在原始数据集上设置它时,索引数组上的标量坐标'x' 与非标量坐标(和维度)'x' 冲突。因此 xarray 错误而不是覆盖变量。

    要解决这个问题,您需要在索引后删除标量 'x'。在当前版本的 xarray 中,您可以使用 drop 执行此操作:

    >>> ds['bar'] = ds['bar'].sel(x=1).drop('x')
    >>> ds
    <xarray.Dataset>
    Dimensions:  (x: 2, y: 3)
    Coordinates:
      * x        (x) int64 1 2
      * y        (y) int64 1 2 3
        bar      (y) int64 4 5 6
    Data variables:
        foo      (x, y) float64 -0.9595 0.6704 -1.047 0.9948 0.8241 1.643
    

    在 xarray 的未来版本(v0.9 及更高版本)中,您将能够通过编写 drop=True 来在索引时删除坐标,例如 ds['bar'].sel(x=1, drop=True)

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 1970-01-01
      • 2016-09-07
      • 2019-04-21
      • 2020-12-06
      • 1970-01-01
      • 2020-07-09
      • 2021-04-13
      • 1970-01-01
      相关资源
      最近更新 更多