如何对同一维度内不同坐标的值进行操作?

How to operate on values with different coordinates within the same dimension?

当对不同的数据数组进行操作时,xarray 足以确保操作发生在具有相同坐标的值上。这通常是可取的,但有时我想明确地对具有不同坐标的值进行操作。这将导致空 DataArray:

In [275]: ds = xarray.DataArray(random.random(size=10), {"a": arange(10)}, dims=["a"])

In [274]: ds.sel(a=slice(5, None)) - ds.sel(a=slice(0, 4))
Out[274]: 
<xarray.DataArray (a: 0)>
array([], dtype=float64)
Coordinates:
  * a        (a) int64 

当然,我可以在底层 .values 上操作,绕过 xarray,但是有没有办法在 xarray API 中执行此操作?我意识到我必须通知 xarray 应该为结果分配什么坐标,但是维度、不受影响的坐标、名称、编码和属性仍然可以被复制。

我的实际用例是查找布尔数组AB的两个A[i] & B[i+1]具有相同坐标的实例,例如(A[:-1] & B[1:]),但 xarray 的有用对齐方式使它与 (A & B)[1:-1] 相同,后者具有不同的含义。

但是有很多可能的应用:

一个人将不得不做这样的事情:

xarray.DataArray(a.variable - b.variable, coords=a.coords, name="Δ")

这仍然确保维度一致(如果不一致,将广播),但它确实允许计算具有不同坐标的值之间的操作。那么coords=关键字是必不可少的,它告诉xarray结果的坐标应该是什么。