2012-01-07 12 views
8

Ho un numpy.ndarray in cui il valore massimo si verifica per lo più più di una volta.Come trovare l'ultima occorrenza del valore massimo in un numpy.ndarray

EDIT: Questo è sottilmente diverso dal numpy.argmax: how to get the index corresponding to the *last* occurrence, in case of multiple occurrences of the maximum values perché l'autore dice

O, meglio ancora, è possibile ottenere un elenco di indici di tutte le occorrenze del valore massimo nella matrice?

mentre nel mio caso ottenere un elenco del genere può rivelarsi molto costoso

E 'possibile trovare l'indice dell'ultima occorrenza del valore massimo usando qualcosa come numpy.argmax? Voglio trovare solo l'indice dell'ultima occorrenza, non è una matrice di tutte le occorrenze (dal momento che diverse centinaia possono essere lì)

Ad esempio, questo restituirà l'indice della prima occorrenza cioè 2

import numpy as np 
a=np.array([0,0,4,4,4,4,2,2,2,2]) 
print np.argmax(a) 

Tuttavia, desidero che venga emesso 5.

+0

possibile duplicato di [numpy.argmax: come ottenere l'indice corrispondente all'ultimo * * occorrenza, nel caso di più occorrenze dei valori massimi] (http://stackoverflow.com/questions/7038975/ numpy-argmax-how-to-get-the-index-corrispondente-all'ultima-occorrenza-in-ca) – outis

+0

L'autore ci vuole l'indice di tutte le occorrenze e la soluzione fornita lì 'occorrenze = np.where (a == a.max()) 'genererà un array di tutti i valori massimi che possono essere molto costosi nel mio caso –

+0

sebbene la risposta risolva solo come ottenere tutte le occorrenze, l'interrogante ha chiesto entrambe, quindi" possibili duplicati " piuttosto che "duplicare". – outis

risposta

14

numpy.argmax restituisce solo l'indice della prima occorrenza. Si potrebbe applicare argmax a una vista inversa della matrice:

import numpy as np 
a = np.array([0,0,4,4,4,4,2,2,2,2]) 
b = a[::-1] 
i = len(b) - np.argmax(b) - 1 
i  # 5 
a[i:] # array([4, 2, 2, 2, 2]) 

Nota NumPy non copia l'array, ma invece crea una vista della originale con una stride che accede in ordine inverso.

id(a) == id(b.base) # True 
+0

Non esiste una funzione equivalente che ottiene l'indice dell'ultima occorrenza? Inoltre, l'inversione dell'array non è un'operazione di tipo O (n), per non parlare del raddoppiamento dell'utilizzo della memoria? –

+3

Dubbi c'è un'altra funzione, poiché la vista inversa è abbastanza efficiente. – outis

Problemi correlati