Düz olmayan indeksleri döndüren uyuşuk dizinin argmax'ı


99

Bir Numpy dizisindeki maksimum elemanın indislerini almaya çalışıyorum. Bu kullanılarak yapılabilir numpy.argmax. Benim problemim, tüm dizideki en büyük elemanı bulmak ve bunun indislerini almak istemem.

numpy.argmax ya istediğim gibi olmayan bir eksen boyunca ya da düzleştirilmiş diziye uygulanabilir, ki bu benim istediğim türden.

Benim sorunum, çok boyutlu indeksi istediğimde numpy.argmaxwith kullanmanın axis=Nonedüz indeksi döndürmesidir.

divmodDüz olmayan bir endeks almak için kullanabilirim ama bu çirkin hissettiriyor. Bunu yapmanın daha iyi bir yolu var mı?

Yanıtlar:


170

numpy.unravel_index()Sonuçta kullanabilirsiniz numpy.argmax():

>>> a = numpy.random.random((10, 10))
>>> numpy.unravel_index(a.argmax(), a.shape)
(6, 7)
>>> a[6, 7] == a.max()
True

21
np.where(a==a.max())

maksimum öğelerin koordinatlarını döndürür, ancak diziyi iki kez ayrıştırması gerekir.

>>> a = np.array(((3,4,5),(0,1,2)))
>>> np.where(a==a.max())
(array([0]), array([2]))

Bu, ile karşılaştırıldığında argmax, maksimuma eşit tüm elemanların koordinatlarını döndürür. argmaxbunlardan yalnızca birini np.ones(5).argmax()döndürür ( döndürür 0).


10
Bu, diziyi yalnızca iki kez değil, üç kez yineleyecektir. Bir kez maksimumu bulmak için, ikinci kez sonucu oluşturmak için ==ve üçüncü kez Truebu sonuçtan değerleri çıkarmak için . Maksimuma eşit birden fazla öğe olabileceğini unutmayın.
Sven Marnach

1

Maksimum değerin tüm olaylardan olmayan düz indeksi elde etmek için, eumiro en değiştirebilir cevabı kullanarak hafifçe argwhereyerine 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]])

Üç geçiş ve bir matris oluşturma aldığınız için etkili değildir. 9000x7000 görüntümüzün (A3 @ 600dpi) olduğunu hayal edin - yine de çözümünüzde ısrar eder miydiniz?
Maksym Ganenko
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.