在与二维坐标关联的数据数组中查找最大值的坐标
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
.
我有一个数据数组,其中包含纬度和经度 (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
.