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

Find coordinates of max value in dataarray associated with 2D coordinates

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

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

xarray.DataArray 'Power' (y:1500, x:2500)
array([[nan, nan, nan, ..., nan, nan, nan],
       [nan, nan, nan, ..., nan, nan, nan],
       [nan, nan, nan, ..., nan, nan, nan],
       ...,
       [nan, nan, nan, ..., nan, nan, nan],
       [nan, nan, nan, ..., nan, nan, nan],
       [nan, 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() returns 的值 array(3335.06591797)。尝试 da.argmax() 也有效,returns array(2365177)。我认为可能有一种方法可以利用此值来查找数组中的位置,即坐标,但我不确定该怎么做。

第三种选择是尝试利用 da.idxmax(),但这要求数据数组具有共同的尺寸和坐标,而我在这种情况下没有。

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

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

The dimensions over which to find the maximum. By default, finds maximum over all dimensions - for now returning an int for backward compatibility, but this is deprecated, in future will return a dict with indices for all dimensions; to return a dict with all dimensions now, pass ‘…’.

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

还有这个较早的问题: 但它早于 argmax.