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?

Andreas Mueller
sumber

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
Sven Marnach
sumber
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).

eumiro
sumber
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]])
Richard Ludlow
sumber
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