2016-10-21 5 views
3

простой вопрос: я не только хочу значение максимума, но и его координаты в xarray DataArray. Как это сделать?Как получить координаты максимума в xarray?

Я могу, конечно, написать свой собственный простой эффект funtion, но мне интересно, есть ли что-нибудь встроенное в xarray?

ответ

7

Вы можете использовать da.where() для фильтрации на основе максимального значения:

In [15]: da = xr.DataArray(np.random.rand(2,3,4)) 

In [16]: da.where(da==da.max(), drop=True) 
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 
+0

Очень хороший. Мог бы добавить '.squeeze()', чтобы выжать скалярные размеры. – shoyer

1

Метод 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 для этого)

 Смежные вопросы

  • Нет связанных вопросов^_^