Jak używać funkcji NumPy argmax() w Pythonie?

W tym samouczku dowiesz się, jak używać funkcji NumPy argmax() do znalezienia indeksu maksymalnego elementu w tablicach.

NumPy to potężna biblioteka do obliczeń naukowych w Pythonie; dostarcza tablice N-wymiarowe, które są bardziej wydajne niż listy Pythona. Jedną z typowych operacji, które wykonasz podczas pracy z tablicami NumPy, jest znalezienie maksymalnej wartości w tablicy. Jednak czasami możesz chcieć znaleźć indeks, w którym występuje maksymalna wartość.

Funkcja argmax() pomaga znaleźć indeks maksimum zarówno w tablicach jednowymiarowych, jak i wielowymiarowych. Przejdźmy do tego, jak to działa.

Jak znaleźć indeks maksymalnego elementu w tablicy NumPy

Aby śledzić ten samouczek, musisz mieć zainstalowany Python i NumPy. Możesz kodować, uruchamiając Python REPL lub uruchamiając notatnik Jupyter.

Najpierw zaimportujmy NumPy pod zwykłym aliasem np.

import numpy as np

Możesz użyć funkcji NumPy max(), aby uzyskać maksymalną wartość w tablicy (opcjonalnie wzdłuż określonej osi).

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

# Output
10

W takim przypadku np.max(array_1) zwraca 10, co jest poprawne.

Załóżmy, że chcesz znaleźć indeks, w którym występuje maksymalna wartość w tablicy. Możesz zastosować następujące dwuetapowe podejście:

  • Znajdź maksymalny element.
  • Znajdź indeks maksymalnego elementu.
  • W tablicy_1 maksymalna wartość 10 występuje pod indeksem 4, po indeksowaniu zerowym. Pierwszy element ma indeks 0; drugi element ma indeks 1 i tak dalej.

    Aby znaleźć indeks, w którym występuje maksimum, możesz użyć funkcji NumPy where(). np.where(warunek) zwraca tablicę wszystkich indeksów, których warunek ma wartość True.

    Będziesz musiał dotknąć tablicy i uzyskać dostęp do elementu z pierwszego indeksu. Aby dowiedzieć się, gdzie występuje maksymalna wartość, ustawiamy warunek na array_1==10; Przypomnij sobie, że 10 to maksymalna wartość w array_1.

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

    Użyliśmy np.where() tylko z warunkiem, ale nie jest to zalecana metoda korzystania z tej funkcji.

    📑 Uwaga: NumPy gdzie() Funkcja:
    np.where(warunek,x,y) zwraca:

    – Elementy od x, gdy warunek jest prawdziwy, oraz
    – Elementy z y, gdy warunek to False.

    Dlatego łącząc funkcje np.max() i np.where() możemy znaleźć maksymalny element, po którym następuje indeks, w którym występuje.

    Zamiast powyższego dwuetapowego procesu, możesz użyć funkcji NumPy argmax(), aby uzyskać indeks maksymalnego elementu w tablicy.

    Składnia funkcji NumPy argmax()

    Ogólna składnia funkcji NumPy argmax() jest następująca:

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

    W powyższej składni:

    • tablica to dowolna poprawna tablica NumPy.
    • oś jest parametrem opcjonalnym. Podczas pracy z tablicami wielowymiarowymi można użyć parametru axis, aby znaleźć indeks maksimum wzdłuż określonej osi.
    • out to kolejny opcjonalny parametr. Możesz ustawić parametr out na tablicę NumPy, aby przechowywać dane wyjściowe funkcji argmax().

    Uwaga: od wersji NumPy 1.22.0 istnieje dodatkowy parametr keepdims. Kiedy określamy parametr axis w wywołaniu funkcji argmax(), tablica jest redukowana wzdłuż tej osi. Jednak ustawienie parametru keepdims na True zapewnia, że ​​zwracane dane wyjściowe mają taki sam kształt jak tablica wejściowa.

    Używanie NumPy argmax() do znajdowania indeksu maksymalnego elementu

    #1. Użyjmy funkcji NumPy argmax(), aby znaleźć indeks maksymalnego elementu tablicy array_1.

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

    Funkcja argmax() zwraca 4, co jest poprawne!

    #2. Jeśli przedefiniujemy tablicę_1 tak, że 10 występuje dwa razy, funkcja argmax() zwraca tylko indeks pierwszego wystąpienia.

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

    W pozostałych przykładach użyjemy elementów tablicy array_1, które zdefiniowaliśmy w przykładzie 1.

    Używanie NumPy argmax() do znalezienia indeksu maksymalnego elementu w tablicy 2D

    Zmieńmy kształt tablicy NumPy array_1 na dwuwymiarową tablicę z dwoma wierszami i czterema kolumnami.

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

    W przypadku tablicy dwuwymiarowej oś 0 oznacza wiersze, a oś 1 oznacza kolumny. Tablice NumPy podążają za indeksowaniem zerowym. Tak więc indeksy wierszy i kolumn dla tablicy NumPy array_2 są następujące:

    Teraz wywołajmy funkcję argmax() na dwuwymiarowej tablicy array_2.

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

    Mimo że wywołaliśmy argmax() w tablicy dwuwymiarowej, nadal zwraca ona 4. Jest to identyczne z wynikiem dla tablicy jednowymiarowej tablica_1 z poprzedniej sekcji.

    Dlaczego to się zdarza?

    Dzieje się tak, ponieważ nie określiliśmy żadnej wartości parametru osi. Gdy ten parametr osi nie jest ustawiony, domyślnie funkcja argmax() zwraca indeks maksymalnego elementu wzdłuż spłaszczonej tablicy.

    Co to jest tablica spłaszczona? Jeśli istnieje N-wymiarowa tablica o kształcie d1 x d2 x … x dN, gdzie d1, d2, do dN są rozmiarami tablicy wzdłuż wymiarów N, to spłaszczona tablica jest długą jednowymiarową tablicą o rozmiarze d1 * d2 * … * dN.

    Aby sprawdzić, jak wygląda tablica spłaszczona dla array_2, możesz wywołać metodę flatten(), jak pokazano poniżej:

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

    Indeks maksymalnego elementu wzdłuż rzędów (oś = 0)

    Przejdźmy do znalezienia indeksu maksymalnego elementu wzdłuż wierszy (oś = 0).

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

    Ten wynik może być nieco trudny do zrozumienia, ale zrozumiemy, jak to działa.

    Ustawiliśmy parametr axis na zero (oś = 0), ponieważ chcielibyśmy znaleźć indeks maksymalnego elementu wzdłuż wierszy. Dlatego funkcja argmax() zwraca numer wiersza, w którym występuje element maksimum — dla każdej z trzech kolumn.

    Zwizualizujmy to dla lepszego zrozumienia.

    Z powyższego diagramu i wyjścia argmax() mamy co następuje:

    • Dla pierwszej kolumny o indeksie 0 maksymalna wartość 10 występuje w drugim wierszu, o indeksie = 1.
    • Dla drugiej kolumny o indeksie 1 maksymalna wartość 9 występuje w drugim wierszu, o indeksie = 1.
    • Dla trzeciej i czwartej kolumny o indeksie 2 i 3 maksymalne wartości 8 i 4 występują w drugim wierszu, o indeksie = 1.

    Właśnie dlatego mamy tablicę wyjściową ([1, 1, 1, 1]), ponieważ maksymalny element wzdłuż wierszy występuje w drugim wierszu (dla wszystkich kolumn).

    Indeks maksymalnego elementu wzdłuż kolumn (oś = 1)

    Następnie użyjmy funkcji argmax(), aby znaleźć indeks maksymalnego elementu wzdłuż kolumn.

    Uruchom następujący fragment kodu i obserwuj dane wyjściowe.

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

    Czy możesz przeanalizować dane wyjściowe?

    Ustawiliśmy oś = 1, aby obliczyć indeks maksymalnego elementu wzdłuż kolumn.

    Funkcja argmax() zwraca dla każdego wiersza numer kolumny, w której występuje wartość maksymalna.

    Oto wizualne wyjaśnienie:

    Z powyższego diagramu i wyjścia argmax() mamy co następuje:

    • Dla pierwszego wiersza o indeksie 0 maksymalna wartość 7 występuje w trzeciej kolumnie, o indeksie = 2.
    • W drugim wierszu o indeksie 1 maksymalna wartość 10 występuje w pierwszej kolumnie, przy indeksie = 0.

    Mam nadzieję, że teraz rozumiesz, jakie dane wyjściowe, tablica ([2, 0]) oznacza.

    Używanie opcjonalnego parametru out w NumPy argmax()

    Możesz użyć opcjonalnego parametru out w funkcji NumPy argmax(), aby zapisać dane wyjściowe w tablicy NumPy.

    Zainicjujmy tablicę zer, aby przechowywać dane wyjściowe poprzedniego wywołania funkcji argmax() – aby znaleźć indeks maksimum wzdłuż kolumn (oś=1).

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

    Wróćmy teraz do przykładu znajdowania indeksu maksimum elementu wzdłuż kolumn (oś = 1) i ustaw out na out_arr, które zdefiniowaliśmy powyżej.

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

    Widzimy, że interpreter Pythona zgłasza błąd TypeError, ponieważ out_arr został domyślnie zainicjalizowany jako tablica elementów zmiennoprzecinkowych.

    ---------------------------------------------------------------------------
    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'

    Dlatego podczas ustawiania parametru out na tablicę wyjściową ważne jest, aby upewnić się, że tablica wyjściowa ma prawidłowy kształt i typ danych. Ponieważ indeksy tablicy są zawsze liczbami całkowitymi, powinniśmy ustawić parametr dtype na int podczas definiowania tablicy wyjściowej.

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

    Możemy teraz śmiało wywołać funkcję argmax() z parametrami axis i out, i tym razem działa ona bezbłędnie.

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

    Wyjście funkcji argmax() jest teraz dostępne w tablicy out_arr.

    print(out_arr)
    # Output
    [2 0]

    Wniosek

    Mam nadzieję, że ten samouczek pomógł ci zrozumieć, jak używać funkcji NumPy argmax(). Przykłady kodu można uruchomić w notesie Jupyter.

    Przyjrzyjmy się, czego się nauczyliśmy.

    • Funkcja NumPy argmax() zwraca indeks maksymalnego elementu w tablicy. Jeśli maksymalny element występuje więcej niż raz w tablicy a, to np. argmax(a) zwraca indeks pierwszego wystąpienia elementu.
    • Podczas pracy z tablicami wielowymiarowymi można użyć opcjonalnego parametru axis, aby uzyskać indeks maksymalnego elementu wzdłuż określonej osi. Na przykład w tablicy dwuwymiarowej: ustawiając axis = 0 i axis = 1, można uzyskać indeks maksymalnego elementu odpowiednio wzdłuż wierszy i kolumn.
    • Jeśli chcesz przechowywać zwróconą wartość w innej tablicy, możesz ustawić opcjonalny parametr out na tablicę wyjściową. Jednak tablica wyjściowa powinna mieć zgodny kształt i typ danych.

    Następnie zapoznaj się z szczegółowym przewodnikiem po zestawach Pythona.