从xarray数据集中的某些变量中删除维

时间:2017-01-24 18:21:53

标签: python-xarray

我有一个xarray数据集,其中一些变量的维度超过了必要的数量(例如,一个3D数据集,其中"纬度"和#34;经度"变量也随时间变化)。如何删除额外的尺寸?

例如,在下面的数据集中,' bar'是xy轴上的2D变量,沿x轴具有恒定的值。如何从'栏中删除x维度'但不是' foo'?

>>> 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

1 个答案:

答案 0 :(得分:5)

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

>>> 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))来删除索引时的坐标。