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.