Отримайте позицію найбільшого значення в багатовимірному масиві NumPy


83

Як я можу отримати позицію (індекси) найбільшого значення в багатовимірному масиві NumPy?


Якщо є кілька позицій з однаково великими значеннями, чи потрібні вони всі або лише перша (або остання, або будь-яка)?
Триларіон

Відповіді:


179

argmax()Метод повинен допомогти.

Оновлення

(Після прочитання коментаря) Я вважаю, що argmax()метод буде працювати і для багатовимірних масивів. Прикладена документація містить приклад:

>>> a = array([[10,50,30],[60,20,40]])
>>> maxindex = a.argmax()
>>> maxindex
3

Оновлення 2

(Завдяки коментарю KennyTM ) Ви можете використовувати unravel_index(a.argmax(), a.shape)індекс у вигляді кортежу:

>>> from numpy import unravel_index
>>> unravel_index(a.argmax(), a.shape)
(1, 0)

1
Але у мене є багатовимірний масив.
kame

86
Використовуйте unravel_index(a.argmax(), a.shape)для отримання індексу у вигляді кортежу.
kennytm

що означає номер 3? Гаразд, я бачу. Я шукав (1,0).
kame

2
дійсно повинна бути вбудована функція для отримання значення як кортеж
ендоліт


6

(редагувати) Я мав на увазі стару відповідь, яку було видалено . І прийнята відповідь прийшла після моєї. Я погоджуюсь, що argmaxце краще, ніж моя відповідь.

Чи не було б більш читабельним / інтуїтивно зрозумілим робити таке?

numpy.nonzero(a.max() == a)
(array([1]), array([0]))

Або,

numpy.argwhere(a.max() == a)

4
Немає необхідності повільно, тому що ви обчислюєте максимум, а потім порівнюєте його з усіма значеннями a. розгадати_індекс (a.argmax (), a.shape).
Пітер

Я проголосував за це, оскільки він нічого не передбачає щодо кількості випадків a.max () в a. Тоді як a.argmax () поверне "перше" входження (яке є погано визначеним у випадку багатовимірного масиву, оскільки це залежить від вибору шляху обходу). docs.scipy.org/doc/numpy/reference/generated/ ... Я також думаю, що np.where () є більш природним / читабельним, а не np.nonzero ().
FizxMike

2

Ви можете просто написати функцію (яка працює лише у 2d):

def argmax_2d(matrix):
    maxN = np.argmax(matrix)
    (xD,yD) = matrix.shape
    if maxN >= xD:
        x = maxN//xD
        y = maxN % xD
    else:
        y = maxN
        x = 0
    return (x,y)

0

Альтернативний спосіб - це змінити numpyмасив на listта використання maxта indexметоди:

List = np.array([34, 7, 33, 10, 89, 22, -5])
_max = List.tolist().index(max(List))
_max
>>> 4
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.