Argmax dari numpy array yang menampilkan indeks tidak datar


99

Saya mencoba mendapatkan indeks elemen maksimum dalam array Numpy. Ini bisa dilakukan dengan menggunakan numpy.argmax. Masalah saya adalah, saya ingin menemukan elemen terbesar di seluruh array dan mendapatkan indeksnya.

numpy.argmax dapat diterapkan di sepanjang satu sumbu, yang bukan yang saya inginkan, atau pada array yang diratakan, yang merupakan jenis yang saya inginkan.

Masalah saya adalah bahwa menggunakan numpy.argmaxwith axis=Nonemengembalikan indeks datar ketika saya menginginkan indeks multi-dimensi.

Saya bisa menggunakan divmoduntuk mendapatkan indeks non-datar tetapi ini terasa buruk. Apakah ada cara yang lebih baik untuk melakukan ini?

Jawaban:


170

Anda bisa menggunakan numpy.unravel_index()hasil dari 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())

mengembalikan koordinat elemen maksimum, tetapi harus mengurai array dua kali.

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

Ini, dibandingkan dengan argmax, mengembalikan koordinat semua elemen yang sama dengan maksimum. argmaxmengembalikan hanya salah satu dari mereka ( np.ones(5).argmax()kembali 0).


10
Ini akan mengulang array tiga kali, tidak hanya dua kali. Satu kali untuk menemukan nilai maksimum, kedua kali untuk membangun hasil ==, dan ketiga kalinya untuk mengekstrak Truenilai dari hasil ini. Perhatikan bahwa mungkin ada lebih dari satu item yang sama dengan jumlah maksimum.
Sven Marnach

1

Untuk mendapatkan indeks non-datar dari semua kemunculan nilai maksimum, Anda dapat mengubah sedikit jawaban eumiro dengan menggunakan argwheresebagai pengganti 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]])

Ini tidak efektif karena Anda mendapatkan tiga lintasan dan pembuatan matriks. Bayangkan kita memiliki gambar 9000x7000 (A3 @ 600dpi) - apakah Anda masih bersikeras pada solusi Anda?
Maksym Ganenko
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.