Argmax dell'array numpy che restituisce indici non piatti


99

Sto cercando di ottenere gli indici dell'elemento massimo in un array Numpy. Questo può essere fatto usando numpy.argmax. Il mio problema è che vorrei trovare l'elemento più grande dell'intero array e ottenere gli indici di quello.

numpy.argmax può essere applicato lungo un asse, che non è quello che voglio, o sull'array appiattito, che è un po 'quello che voglio.

Il mio problema è che l'utilizzo di numpy.argmaxwith axis=Nonerestituisce l'indice flat quando voglio l'indice multidimensionale.

Potrei usare divmodper ottenere un indice non piatto, ma sembra brutto. C'è un modo migliore per farlo?

Risposte:


169

Potresti usare numpy.unravel_index()sul risultato di numpy.argmax():

>>> a = numpy.random.random((10, 10))
>>> numpy.unravel_index(a.argmax(), a.shape)
(6, 7)
>>> a[6, 7] == a.max()
True

21
np.where(a==a.max())

restituisce le coordinate degli elementi massimi, ma deve analizzare l'array due volte.

>>> a = np.array(((3,4,5),(0,1,2)))
>>> np.where(a==a.max())
(array([0]), array([2]))

Questo, confrontato con argmax, restituisce le coordinate di tutti gli elementi uguali al massimo. argmaxrestituisce solo uno di essi ( np.ones(5).argmax()restituisce 0).


10
Questo itererà l'array tre volte, non solo due. Una volta per trovare il massimo, una seconda volta per creare il risultato ==e una terza volta per estrarre i Truevalori da questo risultato. Tieni presente che potrebbe esserci più di un elemento uguale al massimo.
Sven Marnach,

1

Per ottenere l'indice non piatto di tutte le occorrenze del valore massimo, puoi modificare leggermente la risposta di eumiro usando argwhereinvece di 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]])

Non è efficace poiché ottieni tre passaggi e una creazione di matrice. Immagina di avere un'immagine 9000x7000 (A3 a 600 dpi): insisteresti ancora per la tua soluzione?
Maksym Ganenko
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.