2012-01-07 21 views
8

Tengo una numpy.ndarray en la que el valor máximo se producirá principalmente más de una vez.Cómo encontrar la última aparición del valor máximo en un numpy.ndarray

EDIT: Esto es sutilmente diferente de numpy.argmax: how to get the index corresponding to the *last* occurrence, in case of multiple occurrences of the maximum values porque el autor dice

O, mejor aún, es posible obtener una lista de los índices de todas las apariciones del valor máximo de la matriz?

mientras que en mi caso para conseguir una lista de este tipo puede resultar muy caro

¿Es posible encontrar el índice de la última aparición del valor máximo mediante el uso de algo así como numpy.argmax? Quiero encontrar única el índice de la última aparición, no un conjunto de todas las ocurrencias (ya que varios cientos de personas pueden estar allí)

Por ejemplo esto devolverá el índice de la primera aparición es decir, 2

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

Sin embargo, quiero que muestre 5.

+0

posible duplicado de [numpy.argmax: cómo obtener el índice correspondiente a la última * * ocurrencia, en caso de múltiples ocurrencias de los valores máximos] (http://stackoverflow.com/questions/7038975/ numpy-argmax-cómo-obtener-el-índice-correspondiente-a-la-última-ocurrencia-en-ca) – outis

+0

El autor quiere el índice de todas las ocurrencias, y la solución dada allí 'occurences = np.where (a == a.max()) 'generará una matriz de todos los valores máximos que pueden ser muy caros en mi caso –

+0

, aunque la respuesta solo se refiere a cómo obtener todas las ocurrencias, el preguntador preguntó por ambos, por lo tanto," posible duplicado " en lugar de "duplicar". – outis

Respuesta

14

numpy.argmax solo devuelve el índice de la primera aparición. Se podría aplicar argmax a una vista invertida de la matriz:

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 no copia la matriz sino que crea una vista de la original con una stride que acceda al mismo en orden inverso.

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

¿No hay una función equivalente que obtenga el índice de la última aparición? Además, ¿no va a invertir la matriz una operación O (n), por no mencionar duplicar el uso de la memoria? –

+3

Dudoso que haya otra función, ya que la vista inversa es bastante eficiente. – outis

Cuestiones relacionadas