我有一个xarray数据集,其中一些变量具有比必要更多的维度(例如,"纬度"和"经度"变量也随时间变化的3D数据集).如何删除额外的尺寸?
例如,在下面的数据集中,"bar"是沿轴x
和y
轴的2D变量,沿轴具有恒定的vaues x
.如何x
从'bar'中删除尺寸而不是'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]])}) >>> dsDimensions: (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
shoyer.. 6
删除额外维度(使用索引)的最直接方法会导致稍微混淆的错误消息:
>>> ds['bar'] = ds['bar'].sel(x=1) ValueError: dimension 'x' already exists as a scalar variable
问题是当你在xarray中进行索引时,它会将索引坐标保持为标量坐标:
>>> ds['bar'].sel(x=1)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') >>> dsDimensions: (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)
.
删除额外维度(使用索引)的最直接方法会导致稍微混淆的错误消息:
>>> ds['bar'] = ds['bar'].sel(x=1) ValueError: dimension 'x' already exists as a scalar variable
问题是当你在xarray中进行索引时,它会将索引坐标保持为标量坐标:
>>> ds['bar'].sel(x=1)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') >>> dsDimensions: (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)
.