Bir eksen boyunca uyuşmuş bir dizideki maksimum öğenin dizini nasıl elde edilir


118

2 boyutlu bir NumPy dizim var. Eksenler üzerinden maksimum değerleri nasıl elde edeceğimi biliyorum:

>>> a = array([[1,2,3],[4,3,1]])
>>> amax(a,axis=0)
array([4, 3, 3])

Maksimum elemanların endekslerini nasıl alabilirim? Bu yüzden çıktı olarak istiyorumarray([1,1,0])

Yanıtlar:


142
>>> a.argmax(axis=0)

array([1, 1, 0])

1
bu tamsayılar için iyi çalışıyor ancak kayan değerler ve 0 ile 1 arasındaki sayılar için ne yapabilirim
Priyom saha

100
>>> import numpy as np
>>> a = np.array([[1,2,3],[4,3,1]])
>>> i,j = np.unravel_index(a.argmax(), a.shape)
>>> a[i,j]
4

11
Bu cevabın yanıltıcı olduğuna dikkat edin. OP'nin sorduğu gibi, belirli bir eksen boyunca değil, tüm eksen boyunca dizinin maksimum elemanının dizinini hesaplar: bu yanlış. Dahası, birden fazla maksimum varsa, yalnızca ilk maksimumun endekslerini alır: bu belirtilmelidir. Onun a = np.array([[1,4,3],[4,3,1]])geri döndüğünü görmeye çalışın i,j==0,1ve çözümü ihmal eder i,j==1,0. Bunun yerine tüm maksimumların indisleri için kullanın i,j = where(a==a.max().
gg349

36

argmax()her satır için yalnızca ilk geçtiği yeri döndürür. http://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html

Bunu şekilli bir dizi için yapmanız gerekirse, bu şunlardan daha iyi çalışır unravel:

import numpy as np
a = np.array([[1,2,3], [4,3,1]])  # Can be of any shape
indices = np.where(a == a.max())

Koşullarınızı da değiştirebilirsiniz:

indices = np.where(a >= 1.5)

Yukarıdakiler, istediğiniz formda size sonuçları verir. Alternatif olarak, aşağıdakileri yaparak x, y koordinatlarından oluşan bir listeye dönüştürebilirsiniz:

x_y_coords =  zip(indices[0], indices[1])

2
Bu benim için işe yaramadı ... indices = np.where(a==a.max())3. satırda mı demek istiyorsun ?
atomh33ls

Haklısın atomh33ls! Bunu anladığın için teşekkürler. Bu ifadeyi, uygun koşul için ikinci eşittir işaretini içerecek şekilde düzelttim.
SevakPrime

@SevakPrime, .max()yerine @ atomh33ls tarafından gösterilen ikinci bir hata vardı .argmax(). Lütfen yanıtı düzenleyin
gg349

@ gg349, ne istediğinize bağlı. argmax, bunu, OP'nin eumiro tarafından bu yanıtı onaylamasını istediği gibi görünen bir eksen boyunca sağlar.
SevakPrime

@ Atomh33ls ve önerdiğim düzeltmenin, dizinin en büyük eleman (lar) ının indeksine yol açtığını görüyorum, bu sırada OP belirli bir eksendeki en büyük elemanları soruyordu. Ancak, mevcut çözümünüzün buna yol x_y_coord = [(0, 2), (1, 1)]açtığına, @eumiro cevabıyla uyuşmadığına ve yanlış olduğuna dikkat edin . Örneğin, a = array([[7,8,9],[10,11,12]])kodunuzun bu girişte herhangi bir isabeti olmadığını görmeyi deneyin . Ayrıca, bunun daha iyi çalıştığını söylüyorsunuz unravel, ancak @blas tarafından gönderilen çözüm, bir eksen boyunca jsut değil, mutlak maksimum sorununu yanıtlıyor.
gg349

3
v = alli.max()
index = alli.argmax()
x, y = index/8, index%8
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.