删除额外维度(使用索引)的最直接方法会导致出现稍微令人困惑的错误消息:
>>> 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
, e.g., ds['bar'].sel(x=1, drop=True)
.