与根据数组中的位置对齐数据的 numpy 不同,xarray 在执行数据操作时沿给定维度使用 labels 来对齐数据。因此,像a 和b 这样的偏移标签沿关卡维度将不会按照您期望的方式执行。
设置一个虚拟示例:
In [1]: import xarray as xr, pandas as pd, numpy as np
In [2]: u = xr.DataArray(np.arange(5), dims=['level'], coords=[list('abcde')])
In [3]: u
Out[3]:
<xarray.DataArray (level: 5)>
array([0, 1, 2, 3, 4])
Coordinates:
* level (level) <U1 'a' 'b' 'c' 'd' 'e'
在您的示例中查看 a 和 b 时,您正在使用偏移量(slice(0, length-1) 与 slice(1, length))对数据进行切片。执行此操作时,请注意“级别”的索引不再对齐:
In [4]: a = u.isel(level=slice(0, len(u.level)- 1))
...: b = u.isel(level=slice(1, len(u.level)))
In [5]: a
Out[5]:
<xarray.DataArray (level: 4)>
array([0, 1, 2, 3])
Coordinates:
* level (level) <U1 'a' 'b' 'c' 'd'
In [6]: b
Out[6]:
<xarray.DataArray (level: 4)>
array([1, 2, 3, 4])
Coordinates:
* level (level) <U1 'b' 'c' 'd' 'e'
当添加两者时,或在任何涉及广播和自动对齐的操作中(请参阅下面的文档参考),缺失值将从结果中删除。此外,在结果中,请注意总和是元素总和,其中每个元素基于标签 (b + b, c + c, d + d) 对齐,而不是基于位置 (b + a, c + b , d + c)。
In [7]: a + b
Out[7]:
<xarray.DataArray (level: 3)>
array([2, 4, 6])
Coordinates:
* level (level) <U1 'b' 'c' 'd'
您正在寻找的是首先使用shift 方法移动轴标签,以便在添加之前对齐坐标标签:
In [10]: c = u.shift(level=-1)
In [11]: c
Out[11]:
<xarray.DataArray (level: 5)>
array([ 1., 2., 3., 4., nan])
Coordinates:
* level (level) <U1 'a' 'b' 'c' 'd' 'e'
In [12]: a + c
Out[12]:
<xarray.DataArray (level: 4)>
array([1., 3., 5., 7.])
Coordinates:
* level (level) <U1 'a' 'b' 'c' 'd'
现在,当您添加 a + c 时,坐标会按照您想要的方式排列。
有关详细信息,请参阅broadcasting by dimension name 和 automatic alignment 上的 xarray 计算文档。