Python'da NumPy argmax() İşlevi Nasıl Kullanılır

Yayınlanan: 2022-09-14

Bu öğreticide, dizilerdeki maksimum öğenin dizinini bulmak için NumPy argmax() işlevinin nasıl kullanılacağını öğreneceksiniz.

NumPy, Python'da bilimsel hesaplama için güçlü bir kitaplıktır; Python listelerinden daha performanslı N boyutlu diziler sağlar. NumPy dizileriyle çalışırken gerçekleştireceğiniz yaygın işlemlerden biri dizideki maksimum değeri bulmaktır. Ancak bazen maksimum değerin oluştuğu dizini bulmak isteyebilirsiniz.

argmax() işlevi, hem tek boyutlu hem de çok boyutlu dizilerde maksimumun dizinini bulmanıza yardımcı olur. Nasıl çalıştığını öğrenmek için devam edelim.

NumPy Dizisinde Maksimum Öğe Dizini Nasıl Bulunur?

Bu öğreticiyi takip etmek için Python ve NumPy'nin kurulu olması gerekir. Bir Python REPL başlatarak veya bir Jupyter not defteri başlatarak kod yazabilirsiniz.

İlk olarak, NumPy'yi normal takma ad np altında içe aktaralım.

 import numpy as np

Bir dizideki (isteğe bağlı olarak belirli bir eksen boyunca) maksimum değeri elde etmek için NumPy max() işlevini kullanabilirsiniz.

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

Bu durumda, np.max(array_1) , doğru olan 10 değerini döndürür.

Dizide maksimum değerin oluştuğu dizini bulmak istediğinizi varsayalım. Aşağıdaki iki adımlı yaklaşımı uygulayabilirsiniz:

  1. Maksimum elemanı bulun.
  2. Maksimum elemanın indeksini bulun.

array_1 'da, sıfır indekslemeyi takiben indeks 4'te maksimum 10 değeri oluşur. İlk eleman 0 indeksindedir; ikinci öğe dizin 1'dedir, vb.

numpy-argmax

Maksimumun gerçekleştiği dizini bulmak için NumPy where() işlevini kullanabilirsiniz. np.where(condition) , condition True olduğu tüm dizinlerin bir dizisini döndürür.

Diziye dokunmanız ve ilk dizindeki öğeye erişmeniz gerekecek. Maksimum değerin nerede olduğunu bulmak için condition array_1==10 olarak ayarladık; array_1 içindeki maksimum değerin 10 olduğunu hatırlayın.

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

np.where() 'i yalnızca koşulla kullandık, ancak bu işlevi kullanmak için önerilen yöntem bu değil.

Not: NumPy where() Function :
np.where(condition,x,y) döndürür:

– Koşul True olduğunda x öğesinden gelen öğeler ve
– Koşul False olduğunda y öğesinden gelen öğeler.

Bu nedenle, np.max() ve np.where() işlevlerini zincirleyerek, maksimum öğeyi ve ardından oluştuğu dizini bulabiliriz.

Yukarıdaki iki adımlı işlem yerine, dizideki maksimum öğenin dizinini almak için NumPy argmax() işlevini kullanabilirsiniz.

NumPy argmax() İşlevinin Sözdizimi

NumPy argmax() işlevini kullanmak için genel sözdizimi aşağıdaki gibidir:

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

Yukarıdaki sözdiziminde:

  • dizi , geçerli herhangi bir NumPy dizisidir.
  • eksen isteğe bağlı bir parametredir. Çok boyutlu dizilerle çalışırken, belirli bir eksen boyunca maksimumun indeksini bulmak için axis parametresini kullanabilirsiniz.
  • out başka bir isteğe bağlı parametredir. argmax() işlevinin çıktısını depolamak için out parametresini bir NumPy dizisine ayarlayabilirsiniz.

Not : NumPy sürüm 1.22.0'dan itibaren ek bir keepdims parametresi vardır. argmax() işlev çağrısında axis parametresini belirttiğimizde, dizi o eksen boyunca küçülür. Ancak keepdims parametresini True olarak ayarlamak, döndürülen çıktının giriş dizisiyle aynı şekilde olmasını sağlar.

Maksimum Öğenin Dizinini Bulmak için NumPy argmax()'ı Kullanma

#1 . array_1 içindeki maksimum öğenin dizinini bulmak için NumPy argmax() işlevini array_1 .

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

argmax() işlevi, doğru olan 4 değerini döndürür!

# 2 . 10 iki kez olacak şekilde array_1 yeniden tanımlarsak, argmax() işlevi yalnızca ilk oluşumun dizinini döndürür.

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

Örneklerin geri kalanı için örnek 1'de tanımladığımız array_1 öğelerini kullanacağız.

2B Dizide Maksimum Öğenin Dizinini Bulmak için NumPy argmax()'ı Kullanma

NumPy array_1 dizisini iki satır ve dört sütunlu iki boyutlu bir diziye yeniden şekillendirelim.

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

İki boyutlu bir dizi için, 0 ekseni satırları ve 1 ekseni sütunları belirtir. NumPy dizileri sıfır indekslemeyi takip eder. Dolayısıyla, NumPy dizisi array_2 için satır ve sütunların indeksleri aşağıdaki gibidir:

numpy-argmax-2darray

Şimdi, iki boyutlu dizideki argmax() işlevini çağıralım, array_2 .

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

İki boyutlu dizide argmax() rağmen, yine de 4 döndürür. Bu, önceki bölümdeki tek boyutlu dizinin çıktısı olan array_1 ile aynıdır.

Bu neden oluyor?

Bunun nedeni, eksen parametresi için herhangi bir değer belirtmemiş olmamızdır. Bu eksen parametresi ayarlanmadığında, varsayılan olarak argmax() işlevi, düzleştirilmiş dizi boyunca maksimum öğenin dizinini döndürür.

Düzleştirilmiş dizi nedir? d1 x d2 x … x dN şeklinde N boyutlu bir dizi varsa, burada d1, d2, dN'ye kadar N boyutları boyunca dizinin boyutlarıdır, o zaman düzleştirilmiş dizi uzun tek boyutlu bir boyut dizisidir d1 * d2 * … * dN.

array_2 için düzleştirilmiş dizinin nasıl göründüğünü kontrol etmek için, aşağıda gösterildiği gibi flatten() yöntemini çağırabilirsiniz:

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

Satırlar Boyunca Maksimum Elemanın Dizini (eksen = 0)

Satırlar boyunca maksimum elemanın indeksini bulmaya devam edelim (eksen = 0).

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

Bu çıktıyı anlamak biraz zor olabilir, ancak nasıl çalıştığını anlayacağız.

Satırlar boyunca maksimum elemanın indeksini bulmak istediğimizden, axis parametresini sıfıra ( axis = 0 ) ayarladık. Bu nedenle, argmax() işlevi, üç sütunun her biri için maksimum öğenin gerçekleştiği satır numarasını döndürür.

Bunu daha iyi anlamak için görselleştirelim.

numpy-argmax-axis0

Yukarıdaki şemadan ve argmax() çıktısından aşağıdakilere sahibiz:

  • 0 dizinindeki ilk sütun için, ikinci satırda dizin = 1'de maksimum 10 değeri oluşur.
  • Dizin 1'deki ikinci sütun için, ikinci satırda dizin = 1'de maksimum değer 9 oluşur.
  • Dizin 2 ve 3'teki üçüncü ve dördüncü sütunlar için, maksimum 8 ve 4 değerlerinin her ikisi de ikinci satırda, dizin = 1'de gerçekleşir.

Tam olarak bu nedenle çıktı array([1, 1, 1, 1]) sahibiz çünkü satırlar boyunca maksimum öğe ikinci satırda (tüm sütunlar için) oluşur.

Sütunlar Boyunca Maksimum Elemanın İndeksi (eksen = 1)

Ardından, sütunlar boyunca maksimum öğenin dizinini bulmak için argmax() işlevini kullanalım.

Aşağıdaki kod parçacığını çalıştırın ve çıktıyı izleyin.

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

Çıktıyı ayrıştırabilir misin?

Sütunlar boyunca maksimum elemanın indeksini hesaplamak için axis = 1 ayarladık.

argmax() işlevi, her satır için maksimum değerin oluştuğu sütun numarasını döndürür.

İşte görsel bir açıklama:

numpy-argmax-axis1

Yukarıdaki şemadan ve argmax() çıktısından aşağıdakilere sahibiz:

  • Dizin 0'daki ilk satır için, dizin = 2'de üçüncü sütunda maksimum değer 7 oluşur.
  • Dizin 1'deki ikinci satır için, ilk sütunda dizin = 0'da maksimum değer 10 oluşur.

Artık array([2, 0]) çıktısının ne anlama geldiğini anladığınızı umuyorum.

NumPy argmax() içinde İsteğe bağlı çıkış Parametresini Kullanma

Çıktıyı bir NumPy dizisinde depolamak için NumPy argmax() işlevindeki isteğe bağlı out parametresini kullanabilirsiniz.

Önceki argmax() işlev çağrısının çıktısını depolamak için bir sıfır dizisini başlatalım – sütunlar boyunca maksimumun dizinini bulmak için ( axis= 1 ).

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

Şimdi, sütunlar boyunca ( axis = 1 ) maksimum elemanın indeksini bulma örneğini tekrar gözden geçirelim ve yukarıda tanımladığımız out_arr out ayarlayalım.

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

Python yorumlayıcısının bir TypeError attığını görüyoruz, çünkü out_arr varsayılan olarak bir dizi yüzer olarak başlatıldı.

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

Bu nedenle, çıkış dizisine out parametresini ayarlarken, çıkış dizisinin doğru şekil ve veri türünde olduğundan emin olmak önemlidir. Dizi indeksleri her zaman tamsayı olduğundan, çıktı dizisini tanımlarken dtype parametresini int olarak ayarlamalıyız.

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

Şimdi devam edip hem axis hem de out parametreleriyle argmax() işlevini çağırabiliriz ve bu sefer hatasız çalışır.

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

argmax() işlevinin çıktısına artık out_arr dizisinden erişilebilir.

 print(out_arr) # Output [2 0]

Çözüm

Umarım bu eğitim, NumPy argmax() işlevini nasıl kullanacağınızı anlamanıza yardımcı olmuştur. Kod örneklerini bir Jupyter not defterinde çalıştırabilirsiniz.

Öğrendiklerimizi gözden geçirelim.

  • NumPy argmax() işlevi, bir dizideki maksimum öğenin dizinini döndürür. a dizisinde maksimum öğe birden fazla kez ortaya çıkıyorsa, np.argmax(a) öğenin ilk oluşumunun dizinini döndürür.
  • Çok boyutlu dizilerle çalışırken, belirli bir eksen boyunca maksimum öğenin dizinini almak için isteğe bağlı eksen parametresini kullanabilirsiniz. Örneğin, iki boyutlu bir dizide: axis = 0 ve axis = 1 olarak ayarlayarak, sırasıyla satırlar ve sütunlar boyunca maksimum elemanın indeksini alabilirsiniz.
  • Döndürülen değeri başka bir dizide saklamak istiyorsanız, çıkış dizisine isteğe bağlı out parametresini ayarlayabilirsiniz. Ancak, çıktı dizisi uyumlu şekil ve veri türünde olmalıdır.

Ardından, Python kümeleriyle ilgili ayrıntılı kılavuza göz atın.