Как получить индекс максимального элемента в массиве numpy вдоль одной оси

118

У меня есть 2-мерный массив 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])
eumiro
источник
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
Обратите внимание, что этот ответ вводит в заблуждение. Он вычисляет индекс максимального элемента массива по всей оси, а не по заданной оси, как спрашивает OP: это неверно. Более того, если имеется более одного максимума, он извлекает индексы только первого максимума: на это следует указать. Попытайтесь a = np.array([[1,4,3],[4,3,1]])увидеть, что он вернется i,j==0,1, и пренебрегайте решением при i,j==1,0. Для индексов всех максимумов используйте взамен i,j = where(a==a.max().
gg349 02
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])
SevakPrime
источник
2
У меня это не сработало ... Вы имеете indices = np.where(a==a.max())в виду в строке 3?
atomh33ls 07
Вы правы, atomh33ls! Спасибо, что заметили это. Я исправил этот оператор, чтобы включить второй знак равенства для правильного условия.
SevakPrime
@SevakPrime, произошла вторая ошибка, на которую указывает @ atomh33ls .max()вместо .argmax(). Пожалуйста, отредактируйте ответ
gg349
@ gg349, это смотря что вы хотите. argmax предоставляет его по оси, которая, похоже, соответствует тому, как OP хочет, чтобы он утвердил этот ответ eumiro.
SevakPrime 02
Я вижу, что предлагаемое мной исправление @ atomh33ls приводит к индексу самого большого элемента (ов) массива, в то время как OP спрашивал о самых больших элементах вдоль определенной оси. Однако обратите внимание, что ваше текущее решение приводит к тому, x_y_coord = [(0, 2), (1, 1)]что он НЕ соответствует ответу @eumiro и является неправильным. Например, попробуйте с помощью, a = array([[7,8,9],[10,11,12]])чтобы увидеть, что ваш код не попадает в этот вход. Вы также упоминаете, что это работает лучше, чем unravel, но решение, опубликованное @blas, отвечает на проблему абсолютного максимума, а не только по одной оси.
gg349 02
3
v = alli.max()
index = alli.argmax()
x, y = index/8, index%8
Ahmed
источник