Як використовувати функцію NumPy argmax() у Python

У цьому підручнику ви дізнаєтесь, як використовувати функцію NumPy argmax(), щоб знайти індекс максимального елемента в масивах.

NumPy — потужна бібліотека для наукових обчислень на Python; він забезпечує N-вимірні масиви, які є більш продуктивними, ніж списки Python. Однією із поширених операцій, які ви виконуєте під час роботи з масивами NumPy, є ​​пошук максимального значення в масиві. Однак іноді вам може знадобитися знайти індекс, за яким виникає максимальне значення.

Функція argmax() допомагає знайти індекс максимуму як в одновимірних, так і в багатовимірних масивах. Давайте дізнаємося, як це працює.

Як знайти індекс максимального елемента в масиві NumPy

Щоб слідувати цьому посібнику, вам потрібно встановити Python і NumPy. Ви можете кодувати, запустивши Python REPL або запустивши блокнот Jupyter.

Спочатку давайте імпортуємо NumPy під звичайним псевдонімом np.

import numpy as np

Ви можете використовувати функцію NumPy max(), щоб отримати максимальне значення в масиві (необов’язково вздовж певної осі).

array_1 = np.array([1,5,7,2,10,9,8,4])
print(np.max(array_1))

# Output
10

У цьому випадку np.max(array_1) повертає 10, що є правильним.

Припустімо, ви хочете знайти індекс, за яким у масиві виникає максимальне значення. Ви можете застосувати наступний двоетапний підхід:

  • Знайдіть максимальний елемент.
  • Знайдіть індекс максимального елемента.
  • У масиві_1 максимальне значення 10 виникає в індексі 4 після нульового індексування. Перший елемент має індекс 0; другий елемент має індекс 1 і так далі.

    Щоб знайти індекс, за яким виникає максимум, ви можете скористатися функцією NumPy where(). np.where(умова) повертає масив усіх індексів, де умова має значення Істинна.

    Вам доведеться натиснути на масив і отримати доступ до елемента за першим індексом. Щоб знайти максимальне значення, ми встановлюємо умову array_1==10; пам’ятайте, що 10 є максимальним значенням у array_1.

    print(int(np.where(array_1==10)[0]))
    
    # Output
    4

    Ми використовували np.where() лише з умовою, але це не рекомендований метод використання цієї функції.

    📑 Примітка: функція NumPy where():
    np.where(умова,x,y) повертає:

    – Елементи з x, коли умова істинна, і
    – Елементи з y, коли умова False.

      Знайте про основну схему: зірка проти сніжинки

    Таким чином, об’єднавши функції np.max() і np.where(), ми можемо знайти максимальний елемент, а потім індекс, у якому він зустрічається.

    Замість описаного вище двоетапного процесу ви можете використовувати функцію NumPy argmax(), щоб отримати індекс максимального елемента в масиві.

    Синтаксис функції NumPy argmax().

    Загальний синтаксис використання функції NumPy argmax() такий:

    np.argmax(array,axis,out)
    # we've imported numpy under the alias np

    У наведеному вище синтаксисі:

    • масив — будь-який дійсний масив NumPy.
    • axis є необов’язковим параметром. Працюючи з багатовимірними масивами, ви можете використовувати параметр axis, щоб знайти індекс максимуму вздовж певної осі.
    • out – ще один необов’язковий параметр. Ви можете встановити параметр out як масив NumPy, щоб зберігати вихідні дані функції argmax().

    Примітка. Починаючи з NumPy версії 1.22.0, є додатковий параметр keepdims. Коли ми вказуємо параметр осі у виклику функції argmax(), масив зменшується вздовж цієї осі. Але встановлення для параметра keepdims значення True гарантує, що повернений вихід матиме ту саму форму, що й вхідний масив.

    Використання NumPy argmax() для пошуку індексу максимального елемента

    #1. Скористаємося функцією NumPy argmax(), щоб знайти індекс максимального елемента в array_1.

    array_1 = np.array([1,5,7,2,10,9,8,4])
    print(np.argmax(array_1))
    
    # Output
    4

    Функція argmax() повертає 4, що правильно! ✅

    #2. Якщо ми перевизначимо array_1 так, що10 зустрічається двічі, функція argmax() повертає лише індекс першого входження.

    array_1 = np.array([1,5,7,2,10,10,8,4])
    print(np.argmax(array_1))
    
    # Output
    4

    Для решти прикладів ми використовуватимемо елементи array_1, визначені в прикладі №1.

    Використання NumPy argmax() для знаходження індексу максимального елемента в 2D-масиві

    Давайте змінимо форму масиву NumPy array_1 у двовимірний масив із двома рядками та чотирма стовпцями.

    array_2 = array_1.reshape(2,4)
    print(array_2)
    
    # Output
    [[ 1  5  7  2]
     [10  9  8  4]]

    Для двовимірного масиву вісь 0 позначає рядки, а вісь 1 позначає стовпці. Масиви NumPy дотримуються нульової індексації. Отже, індекси рядків і стовпців для масиву NumPy array_2 такі:

    Тепер давайте викличемо функцію argmax() для двовимірного масиву array_2.

    print(np.argmax(array_2))
    
    # Output
    4

    Незважаючи на те, що ми викликали argmax() для двовимірного масиву, він все одно повертає 4. Це ідентично виводу для одновимірного масиву, array_1 з попереднього розділу.

    чому це відбувається 🤔

    Це тому, що ми не вказали значення для параметра осі. Якщо цей параметр осі не встановлено, за замовчуванням функція argmax() повертає індекс максимального елемента вздовж зведеного масиву.

    Що таке зведений масив? Якщо є N-вимірний масив форми d1 x d2 x … x dN, де d1, d2, до dN — розміри масиву вздовж N вимірів, то сплощений масив є довгим одновимірним масивом розміром d1 * d2 * … * dN.

      Найкращі безкоштовні альтернативи Microsoft Office

    Щоб перевірити, як виглядає зведений масив для array_2, ви можете викликати метод flatten(), як показано нижче:

    array_2.flatten()
    
    # Output
    array([ 1,  5,  7,  2, 10,  9,  8,  4])

    Індекс максимального елемента вздовж рядків (вісь = 0)

    Переходимо до знаходження індексу максимального елемента по рядках (вісь = 0).

    np.argmax(array_2,axis=0)
    
    # Output
    array([1, 1, 1, 1])

    Цей результат може бути трохи складним для розуміння, але ми зрозуміємо, як він працює.

    Ми встановили параметр axis на нуль (axis = 0), оскільки ми хотіли б знайти індекс максимального елемента вздовж рядків. Таким чином, функція argmax() повертає номер рядка, у якому зустрічається максимальний елемент, для кожного з трьох стовпців.

    Давайте візуалізуємо це для кращого розуміння.

    З наведеної вище діаграми та результату argmax() ми маємо наступне:

    • Для першого стовпця з індексом 0 максимальне значення 10 зустрічається у другому рядку з індексом = 1.
    • Для другого стовпця з індексом 1 максимальне значення 9 зустрічається у другому рядку з індексом = 1.
    • Для третього та четвертого стовпців з індексами 2 та 3 максимальні значення 8 та 4 зустрічаються у другому рядку з індексом = 1.

    Саме тому ми маємо вихідний масив ([1, 1, 1, 1]), оскільки максимальний елемент уздовж рядків припадає на другий рядок (для всіх стовпців).

    Індекс максимального елемента вздовж стовпців (осі = 1)

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

    Запустіть наведений нижче фрагмент коду та спостерігайте за результатом.

    np.argmax(array_2,axis=1)
    array([2, 0])

    Чи можете ви проаналізувати вихідні дані?

    Ми встановили axis = 1, щоб обчислити індекс максимального елемента вздовж стовпців.

    Функція argmax() повертає для кожного рядка номер стовпця, у якому зустрічається максимальне значення.

    Ось візуальне пояснення:

    З наведеної вище діаграми та результату argmax() ми маємо наступне:

    • Для першого рядка з індексом 0 максимальне значення 7 виникає в третьому стовпці з індексом = 2.
    • Для другого рядка з індексом 1 максимальне значення 10 зустрічається в першому стовпці з індексом = 0.

    Сподіваюся, тепер ви розумієте, що означає вихід, array([2, 0]) засоби.

    Використання додаткового вихідного параметра в NumPy argmax()

    Ви можете використовувати необов’язковий параметр out the у функції NumPy argmax(), щоб зберегти вихідні дані в масиві NumPy.

    Давайте ініціалізуємо масив нулів, щоб зберегти результат попереднього виклику функції argmax(), щоб знайти індекс максимуму вздовж стовпців (вісь= 1).

    out_arr = np.zeros((2,))
    print(out_arr)
    [0. 0.]

    Тепер давайте повернемося до прикладу знаходження індексу максимального елемента вздовж стовпців (вісь = 1) і встановимо out як out_arr, який ми визначили вище.

    np.argmax(array_2,axis=1,out=out_arr)

    Ми бачимо, що інтерпретатор Python видає TypeError, оскільки out_arr за замовчуванням ініціалізовано масивом плаваючих значень.

    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    /usr/local/lib/python3.7/dist-packages/numpy/core/fromnumeric.py in _wrapfunc(obj, method, *args, **kwds)
         56     try:
    ---> 57         return bound(*args, **kwds)
         58     except TypeError:
    
    TypeError: Cannot cast array data from dtype('float64') to dtype('int64') according to the rule 'safe'

    Тому, встановлюючи вихідний параметр для вихідного масиву, важливо переконатися, що вихідний масив має правильну форму та тип даних. Оскільки індекси масиву завжди є цілими числами, ми повинні встановити для параметра dtype значення int під час визначення вихідного масиву.

    out_arr = np.zeros((2,),dtype=int)
    print(out_arr)
    
    # Output
    [0 0]

    Тепер ми можемо продовжити і викликати функцію argmax() як з параметрами axis, так і з out, і цього разу вона працює без помилок.

    np.argmax(array_2,axis=1,out=out_arr)

    Вихідні дані функції argmax() тепер доступні в масиві out_arr.

    print(out_arr)
    # Output
    [2 0]

    Висновок

    Сподіваюся, цей посібник допоміг вам зрозуміти, як використовувати функцію NumPy argmax(). Ви можете запустити приклади коду в блокноті Jupyter.

      Як розблокувати когось у Месенджері

    Давайте повторимо, що ми навчилися.

    • Функція NumPy argmax() повертає індекс максимального елемента в масиві. Якщо максимальний елемент зустрічається більше одного разу в масиві a, тоді np.argmax(a) повертає індекс першого входження елемента.
    • Працюючи з багатовимірними масивами, ви можете використовувати додатковий параметр осі, щоб отримати індекс максимального елемента вздовж певної осі. Наприклад, у двовимірному масиві: встановивши axis = 0 і axis = 1, можна отримати індекс максимального елемента по рядках і стовпцях відповідно.
    • Якщо ви бажаєте зберегти повернуте значення в іншому масиві, ви можете встановити необов’язковий параметр out для вихідного масиву. Однак вихідний масив має бути сумісної форми та типу даних.

    Далі перегляньте докладний посібник із наборів Python.