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.