Cara mendapatkan indeks elemen maksimum dalam array numpy sepanjang satu sumbu

118

Saya memiliki array NumPy 2 dimensi. Saya tahu cara mendapatkan nilai maksimum dari sumbu:

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

Bagaimana saya bisa mendapatkan indeks elemen maksimum? Jadi saya ingin sebagai keluaranarray([1,1,0])

Peter Smit
sumber

Jawaban:

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

array([1, 1, 0])
eumiro
sumber
1
ini berfungsi dengan baik untuk bilangan bulat tetapi apa yang dapat saya lakukan untuk nilai float dan angka antara 0 dan 1
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
blaz
sumber
11
Perhatikan bahwa jawaban ini menyesatkan. Ini menghitung indeks elemen maksimum dari array di semua sumbu, tidak sepanjang sumbu tertentu seperti yang diminta OP: itu salah. Selain itu, jika ada lebih dari satu maksimum, indeks hanya diambil dari maksimum pertama: ini harus ditunjukkan. Cobalah a = np.array([[1,4,3],[4,3,1]])untuk melihat bahwa ia kembali i,j==0,1, dan mengabaikan solusi di i,j==1,0. Untuk indeks dari semua penggunaan maksimal sebagai gantinya i,j = where(a==a.max().
gg349
36

argmax()hanya akan mengembalikan kemunculan pertama untuk setiap baris. http://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html

Jika Anda perlu melakukan ini untuk array berbentuk, ini berfungsi lebih baik daripada 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())

Anda juga dapat mengubah kondisi Anda:

indices = np.where(a >= 1.5)

Di atas memberi Anda hasil dalam formulir yang Anda minta. Alternatifnya, Anda dapat mengonversi ke daftar koordinat x, y dengan:

x_y_coords =  zip(indices[0], indices[1])
SevakPrime
sumber
2
Ini tidak berhasil untuk saya ... Apakah yang Anda maksud indices = np.where(a==a.max())di baris 3?
atomh33ls
Anda benar, atomh33ls! Terima kasih sudah melihatnya. Saya telah memperbaiki pernyataan itu untuk menyertakan tanda sama dengan kedua untuk kondisional yang tepat.
SevakPrime
@SevakPrime, ada kesalahan kedua yang ditunjukkan oleh @ atomh33ls, .max()bukan .argmax(). Harap edit jawabannya
gg349
@ gg349, tergantung apa yang Anda inginkan. argmax menyediakannya di sepanjang sumbu yang tampaknya sesuai dengan keinginan OP setelah menyetujui jawaban itu oleh eumiro.
SevakPrime
Saya melihat bahwa koreksi @ atomh33ls dan saya usulkan mengarah ke indeks elemen terbesar dari array, sementara OP menanyakan tentang elemen terbesar di sepanjang sumbu tertentu. Namun perhatikan bahwa solusi Anda saat ini mengarah ke x_y_coord = [(0, 2), (1, 1)]yang TIDAK cocok dengan jawaban @eumiro, dan salah. Misalnya, coba dengan a = array([[7,8,9],[10,11,12]])untuk melihat bahwa kode Anda tidak memiliki hit pada input ini. Anda juga menyebutkan bahwa ini bekerja lebih baik daripada unravel, tetapi solusi yang diposting oleh @blas menjawab masalah maksimum absolut, bukan hanya sepanjang satu sumbu.
gg349
3
v = alli.max()
index = alli.argmax()
x, y = index/8, index%8
ahmed
sumber