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


99

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

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

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

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

Ответы:



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).


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) - вы все еще настаиваете на своем решении?
Максим Ганенко
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.