简单的问题:我不仅希望在xarray DataArray中使用最大值,还需要它的坐标。怎么做?
我当然可以编写自己的简单reduce函数,但我想知道xarray中是否有内置函数?
答案 0 :(得分:15)
您可以使用da.where()
根据最大值进行过滤:
In [15]: da = xr.DataArray(np.random.rand(2,3,4))
In [16]: da.where(da==da.max(), drop=True).squeeze()
Out[16]:
<xarray.DataArray (dim_0: 1, dim_1: 1, dim_2: 1)>
array([[[ 0.91077406]]])
Coordinates:
* dim_0 (dim_0) int64 0
* dim_1 (dim_1) int64 2
* dim_2 (dim_2) int64 3
答案 1 :(得分:2)
xarray中的idxmax()
方法是very welcome,但是还没有人实现它。
目前,如果你有一维DataArray,你可以通过合并argmax
和isel
找到最大坐标:
>>> array = xarray.DataArray([1, 2, 3, 2, 1], [('x', ['a', 'b', 'c', 'd', 'e'])])
>>> array.isel(x=array.argmax().item())
<xarray.DataArray ()>
array(3)
Coordinates:
x |S1 'c'
这可能是.max()
在每种情况下应该做的事情!不幸的是我们还没到那里。
它还没有以我们想要的方式推广到多个维度的最大值。考虑2D输入:
>>> array2 = xarray.DataArray([[1, 2, 3], [3, 2, 1]], dims=['x', 'y'])
>>> array2.argmax('y') # looks good
<xarray.DataArray (x: 2)>
array([2, 0])
Coordinates:
* x (x) int64 0 1
>>> array2.argmax() # what??
<xarray.DataArray ()>
array(2)
问题在于它会自动展平,如np.argmax
。相反,我们可能想要类似元组数组或数组元组的东西,指示最大的原始整数坐标。对此的贡献也是受欢迎的 - 请打开an issue an GitHub进行讨论。
另外,为了获得原始数组上的点,我们现在需要将argmax插入.isel_points
:
>>> array2.isel_points(x=range(2), y=array.argmax('y'))
<xarray.DataArray (points: 2)>
array([3, 3])
Coordinates:
x (points) int64 0 1
y (points) int64 2 0
* points (points) int64 0 1
(最后,一旦我们fix indexing to do proper broadcasting,您仍然可以使用.isel
。)
答案 2 :(得分:0)
您还可以使用stack:
比方说,数据是一个具有时间,经度,纬度的3d变量,并且您想要最大的时间坐标。
stackdata = data.stack(z=('lon', 'lat'))
maxi = stackdata.argmax(axis=1)
maxipos = stackpr['z'][maxi]
lonmax = [maxipos.values[itr][0] for itr in range(ntime)]
latmax = [maxipos.values[itr][1] for itr in range(ntime)]