Argmax массива numpy, возвращающего неплоские индексы

99

Я пытаюсь получить индексы максимального элемента в массиве Numpy. Это можно сделать с помощью numpy.argmax. Моя проблема в том, что я хотел бы найти самый большой элемент во всем массиве и получить его индексы.

numpy.argmax может быть применен либо вдоль одной оси, что не то, что я хочу, либо к сплющенному массиву, что отчасти то, что я хочу.

Моя проблема в том, что использование numpy.argmaxwith axis=Noneвозвращает плоский индекс, когда мне нужен многомерный индекс.

Я мог бы использовать divmodдля получения не плоского индекса, но это ужасно. Есть ли лучший способ сделать это?

Андреас Мюллер
источник

Ответы:

169

Вы можете использовать numpy.unravel_index()результат numpy.argmax():

>>> a = numpy.random.random((10, 10))
>>> numpy.unravel_index(a.argmax(), a.shape)
(6, 7)
>>> a[6, 7] == a.max()
True
Свен Марнах
источник
21
np.where(a==a.max())

возвращает координаты максимального элемента (ов), но должен дважды проанализировать массив.

>>> a = np.array(((3,4,5),(0,1,2)))
>>> np.where(a==a.max())
(array([0]), array([2]))

Это, по сравнению с argmax, возвращает координаты всех элементов, равные максимуму. argmaxвозвращает только один из них ( np.ones(5).argmax()возвращает 0).

Eumiro
источник
10
Это будет повторять массив трижды, а не только дважды. Один раз, чтобы найти максимум, второй раз построить результат ==, и третий раз извлечь Trueзначения из этого результата. Обратите внимание, что может быть более одного элемента, равного максимуму.
Sven Marnach
1

Чтобы получить не плоский индекс всех вхождений максимального значения, вы можете немного изменить ответ eumiro, используя argwhereвместо where:

np.argwhere(a==a.max())

>>> a = np.array([[1,2,4],[4,3,4]])
>>> np.argwhere(a==a.max())
array([[0, 2],
       [1, 0],
       [1, 2]])
Ричард Ладлоу
источник
Это неэффективно, так как вы получаете три прохода и создание матрицы. Представьте, что у нас есть изображение 9000x7000 (A3 @ 600dpi) - вы все еще настаиваете на своем решении?
Максим Ганенко