Як отримати індекс максимального елемента в нумерованому масиві вздовж однієї осі


118

У мене є двовимірний масив NumPy. Я знаю, як отримати максимальні значення по осях:

>>> a = array([[1,2,3],[4,3,1]])
>>> amax(a,axis=0)
array([4, 3, 3])

Як я можу отримати показники максимальних елементів? Тому я хотів би як вихідarray([1,1,0])

Відповіді:


142
>>> a.argmax(axis=0)

array([1, 1, 0])

1
це добре працює для цілих чисел, але що я можу зробити для плаваючих значень та чисел між 0 і 1
Priyom saha

100
>>> import numpy as np
>>> a = np.array([[1,2,3],[4,3,1]])
>>> i,j = np.unravel_index(a.argmax(), a.shape)
>>> a[i,j]
4

11
Зауважте, що ця відповідь вводить в оману. Він обчислює індекс максимального елемента масиву по всій осі, а не вздовж заданої осі, як запитує ОП: це неправильно. Більше того, якщо є більше одного максимуму, він отримує показники лише першого максимуму: це слід вказати. Спробуйте a = np.array([[1,4,3],[4,3,1]])переконатися, що воно повертається i,j==0,1, і нехтувати рішенням на i,j==1,0. Для показників усіх максимумів використовуйте натомість i,j = where(a==a.max().
gg349

36

argmax()поверне лише перше виникнення для кожного рядка. http://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html

Якщо вам коли-небудь потрібно зробити це для фігурного масиву, це працює краще, ніж unravel:

import numpy as np
a = np.array([[1,2,3], [4,3,1]])  # Can be of any shape
indices = np.where(a == a.max())

Ви також можете змінити свої умови:

indices = np.where(a >= 1.5)

Вищезазначене дає результати у формі, про яку ви просили. Крім того, ви можете перетворити на список координат x, y за допомогою:

x_y_coords =  zip(indices[0], indices[1])

2
Це не спрацювало для мене ... Ви маєте на увазі indices = np.where(a==a.max())рядок 3?
atomh33ls

Ви маєте рацію, atomh33ls! Дякуємо, що помітили це. Я зафіксував це твердження, щоб включити другий знак рівності для належного умовного.
SevakPrime

@SevakPrime, виникла друга помилка, яку вказав @ atomh33ls .max()замість .argmax(). Відредагуйте відповідь
gg349

@ gg349, це залежить від того, що ти хочеш. argmax надає його вздовж осі, яка, здається, є так, як бажає ОП, затвердивши цю відповідь від eumiro.
SevakPrime

Я бачу, що виправлення @ atomh33ls і я пропоную вести до індексу найбільшого елемента (масивів) масиву, тоді як ОП запитував про найбільші елементи по певній осі. Однак зауважте, що ваше поточне рішення призводить до x_y_coord = [(0, 2), (1, 1)]того, що НЕ відповідає відповіді @eumiro, і є неправильним. Наприклад, спробуйте a = array([[7,8,9],[10,11,12]])переконатися, що ваш код не має жодного звернення на цьому вході. Ви також згадуєте, що це працює краще unravel, але рішення, розміщене @blas, відповідає на проблему абсолютного максимуму, а не jsut уздовж однієї осі.
gg349

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.