Метод idxmax()
будет very welcome в xarray, но никто еще не успел его реализовать.
В настоящее время, если у вас есть 1D DataArray, вы можете найти координаты максимума путем объединения argmax
и isel
:
>>> 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
для этого)
Очень хороший. Мог бы добавить '.squeeze()', чтобы выжать скалярные размеры. – shoyer