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

nan*_*loo 10 python-xarray

简单的问题:我不仅想要xarray DataArray中的最大值,还要想要它的坐标.怎么做?

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

Max*_*ian 18

您可以使用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
Run Code Online (Sandbox Code Playgroud)

  • 很不错。可以添加 `.squeeze()` 来挤出标量维度。 (2认同)

sho*_*yer 6

一种idxmax()方法在 xarray 中非常受欢迎,但还没有人开始实施它。

现在,您可以通过组合argmax和来找到最大值的坐标isel:

>>> array = xarray.DataArray(
...    [[1, 2, 3], [3, 2, 1]],
...    dims=['x', 'y'],
...    coords={'x': [1, 2], 'y': ['a', 'b', 'c']})

>>> array
<xarray.DataArray (x: 2, y: 3)>
array([[1, 2, 3],
       [3, 2, 1]])
Coordinates:
  * x        (x) int64 1 2
  * y        (y) <U1 'a' 'b' 'c'

>>> array.isel(y=array.argmax('y'))
<xarray.DataArray (x: 2)>
array([3, 3])
Coordinates:
  * x        (x) int64 1 2
    y        (x) <U1 'c' 'a'
Run Code Online (Sandbox Code Playgroud)

这可能是.max()每种情况下都应该做的!不幸的是,我们还没有到那里。

问题是它还没有以我们想要的方式在多个维度上推广到最大值:

>>> array.argmax()  # what??
<xarray.DataArray ()>
array(2)
Run Code Online (Sandbox Code Playgroud)

问题在于它会自动展平,例如np.argmax. 相反,我们可能想要像元组数组或数组元组之类的东西,指示最大值的原始整数坐标。也欢迎为此做出贡献 -有关更多详细信息,请参阅此问题。

  • `idxmax()` 最近被合并了!https://github.com/pydata/xarray/pull/3871 (5认同)