如何在xarray中获取最大坐标?

时间:2016-10-21 14:44:13

标签: python-xarray

简单的问题:我不仅希望在xarray DataArray中使用最大值,还需要它的坐标。怎么做?

我当然可以编写自己的简单reduce函数,但我想知道xarray中是否有内置函数?

3 个答案:

答案 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,你可以通过合并argmaxisel找到最大坐标:

>>> 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)]