Come ottenere l'indice di un elemento massimo in un array numpy lungo un asse


118

Ho un array NumPy bidimensionale. So come ottenere i valori massimi sugli assi:

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

Come posso ottenere gli indici degli elementi massimi? Quindi vorrei come outputarray([1,1,0])

Risposte:


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

array([1, 1, 0])

1
funziona bene per gli interi, ma cosa posso fare per i valori float ei numeri tra 0 e 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

11
Si noti che questa risposta è fuorviante. Calcola l'indice dell'elemento massimo dell'array su tutto l'asse, non lungo un asse dato come chiede l'OP: è sbagliato. Inoltre, se è presente più di un massimo, recupera gli indici solo del primo massimo: questo è da segnalare. Prova con a = np.array([[1,4,3],[4,3,1]])per vedere che ritorna i,j==0,1e trascura la soluzione a i,j==1,0. Per gli indici di tutti i massimi utilizzare invece i,j = where(a==a.max().
gg349

36

argmax()restituirà solo la prima occorrenza per ogni riga. http://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html

Se hai mai bisogno di farlo per un array sagomato, funziona meglio di 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())

Puoi anche modificare le tue condizioni:

indices = np.where(a >= 1.5)

Quanto sopra ti dà i risultati nella forma che hai richiesto. In alternativa, puoi convertire in un elenco di coordinate x, y tramite:

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

2
Questo non ha funzionato per me ... Intendi indices = np.where(a==a.max())nella riga 3?
atomh33ls

Hai ragione, atomh33ls! Grazie per averlo notato. Ho corretto tale affermazione per includere il secondo segno di uguale per il condizionale appropriato.
SevakPrime

@SevakPrime, si è verificato un secondo errore segnalato da @ atomh33ls, .max()invece di .argmax(). Modifica la risposta
gg349

@ gg349, dipende da cosa vuoi. argmax lo fornisce lungo un asse che sembra essere il modo in cui l'OP lo vuole avendo approvato quella risposta da eumiro.
SevakPrime

Vedo che la correzione @ atomh33ls e che propongo porta all'indice degli elementi più grandi dell'array, mentre l'OP chiedeva gli elementi più grandi lungo un certo asse. Nota tuttavia che la tua soluzione attuale porta a x_y_coord = [(0, 2), (1, 1)]che NON corrisponde alla risposta di @eumiro ed è sbagliata. Ad esempio, prova con a = array([[7,8,9],[10,11,12]])per vedere che il tuo codice non ha alcun riscontro su questo input. Dici anche che funziona meglio di unravel, ma la soluzione postata da @blas risponde al problema del massimo assoluto, non lungo un asse.
gg349

3
v = alli.max()
index = alli.argmax()
x, y = index/8, index%8
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.