如何对同一维度内不同坐标的值进行操作?
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 应该为结果分配什么坐标,但是维度、不受影响的坐标、名称、编码和属性仍然可以被复制。
我的实际用例是查找布尔数组A
和B
的两个A[i] & B[i+1]
具有相同坐标的实例,例如(A[:-1] & B[1:])
,但 xarray
的有用对齐方式使它与 (A & B)[1:-1]
相同,后者具有不同的含义。
但是有很多可能的应用:
- 计算不同时间测量值之间的差异
- 计算不同 lat/lons
测量值之间的差异
一个人将不得不做这样的事情:
xarray.DataArray(a.variable - b.variable, coords=a.coords, name="Δ")
这仍然确保维度一致(如果不一致,将广播),但它确实允许计算具有不同坐标的值之间的操作。那么coords=
关键字是必不可少的,它告诉xarray
结果的坐标应该是什么。
当对不同的数据数组进行操作时,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 应该为结果分配什么坐标,但是维度、不受影响的坐标、名称、编码和属性仍然可以被复制。
我的实际用例是查找布尔数组A
和B
的两个A[i] & B[i+1]
具有相同坐标的实例,例如(A[:-1] & B[1:])
,但 xarray
的有用对齐方式使它与 (A & B)[1:-1]
相同,后者具有不同的含义。
但是有很多可能的应用:
- 计算不同时间测量值之间的差异
- 计算不同 lat/lons 测量值之间的差异
一个人将不得不做这样的事情:
xarray.DataArray(a.variable - b.variable, coords=a.coords, name="Δ")
这仍然确保维度一致(如果不一致,将广播),但它确实允许计算具有不同坐标的值之间的操作。那么coords=
关键字是必不可少的,它告诉xarray
结果的坐标应该是什么。