在与二维坐标关联的数据数组中查找最大值的坐标

问题描述

我有一个包含纬度和经度 (y,x) 多维坐标的数据数组。 Xarray 本机处理这些数据非常棒,它允许我执行诸如 da.max() 之类的操作并接收回一个值。但是,似乎找到与该最大值相关联的坐标可能不是那么简单(或者我可能会遗漏一些东西)。

这是我的数据数组的结构:

xarray.DataArray 'Power' (y:1500,x:2500)
array([[nan,nan,...,nan],[nan,nan]],dtype=float32)
Coordinates:
lon
(y,x)
float64
-113.1 -113.0 ... -52.98 -52.95
lat
(y,x)
float64
15.12 15.12 15.12 ... 51.36 51.36

现在,执行类似 da.max() 的操作会返回值 array(3335.06591797)。尝试 da.argmax() 也有效并返回 array(2365177)。我认为可能有一种方法可以利用此值来查找数组中的位置,即坐标,但我不知道该怎么做。

第三个选项是尝试使用 da.idxmax(),但这要求数据数组具有共同的维度和坐标,而我在本例中没有。

也许也有某种麻木的方法可以做到这一点,但我不清楚这样做的过程。关于在这里做什么的任何想法?使用 da.argmax() 似乎是要走的路,但我卡住了。

解决方法

我查看了 argmax 的文档,它提到了 dim 的以下内容:

用于查找最大值的尺寸。默认情况下,查找 所有维度上的最大值 - 现在返回一个 int 表示向后 兼容性,但不推荐使用,将来会返回一个 dict 具有所有维度的索引;返回所有维度的字典 现在,通过'...'。

https://xarray.pydata.org/en/stable/generated/xarray.DataArray.argmax.html

所以我认为您差不多了:只需使用省略号:da.argmax(...)

演示:

import numpy as np
import xarray as xr

nrow = 2
ncol = 3
da = xr.DataArray(np.random.rand(nrow,ncol),{"x": range(ncol),"y": range(nrow)},["y","x"])
da
<xarray.DataArray (y: 2,x: 3)>
array([[0.79480753,0.06602363,0.86688562],[0.37440161,0.39527931,0.31792832]])
Coordinates:
  * x        (x) int32 0 1 2
  * y        (y) int32 0 1

还有da.argmax(...)

{'y': <xarray.DataArray ()>
 array(0,dtype=int64),'x': <xarray.DataArray ()>
 array(2,dtype=int64)}

还有这个较早的问题:How to get the coordinates of the maximum in xarray? 但它早于 argmax