Obtenga la posición del valor más grande en una matriz NumPy multidimensional

81

¿Cómo puedo obtener la posición (índices) del valor más grande en una matriz NumPy multidimensional?

kame
fuente
En caso de que haya varias posiciones con valores igualmente grandes, ¿las necesita todas o solo la primera (o la última o solo alguna)?
Trilarion

Respuestas:

177

El argmax()método debería ayudar.

Actualizar

(Después de leer el comentario) Creo que el argmax()método también funcionaría para matrices multidimensionales. La documentación vinculada da un ejemplo de esto:

>>> a = array([[10,50,30],[60,20,40]])
>>> maxindex = a.argmax()
>>> maxindex
3

Actualización 2

(Gracias al comentario de KennyTM ) Puede usar unravel_index(a.argmax(), a.shape)para obtener el índice como una tupla:

>>> from numpy import unravel_index
>>> unravel_index(a.argmax(), a.shape)
(1, 0)
Manoj Govindan
fuente
1
Pero tengo una matriz multidimensional.
kame
85
Úselo unravel_index(a.argmax(), a.shape)para obtener el índice como una tupla.
kennytm
¿Qué significa el número 3? Está bien, ya veo. Estaba buscando (1,0).
kame
2
realmente debería haber una función incorporada para obtener el valor como una tupla
endolito
unravel_index docs: docs.scipy.org/doc/numpy-1.10.1/reference/generated/…
Bogdan Varlamov
6

(editar) Me refería a una respuesta anterior que se había eliminado . Y la respuesta aceptada vino después de la mía. Estoy de acuerdo en que argmaxes mejor que mi respuesta.

¿No sería más legible / intuitivo hacer esto?

numpy.nonzero(a.max() == a)
(array([1]), array([0]))

O,

numpy.argwhere(a.max() == a)
otterb
fuente
4
Innecesariamente lento, porque calcula el máximo y luego lo compara con todo de a. unravel_index (a.argmax (), a.shape).
Peter
Voté por esto porque no asume nada sobre el número de apariciones de a.max () en a. Mientras que a.argmax () devolverá la "primera" aparición (que está mal definida en el caso de una matriz multidimensional, ya que depende de la elección de la ruta transversal). docs.scipy.org/doc/numpy/reference/generated/… También creo que np.where () es una elección más natural / legible en lugar de np.nonzero ().
FizxMike
2

Simplemente puede escribir una función (que funciona solo en 2d):

def argmax_2d(matrix):
    maxN = np.argmax(matrix)
    (xD,yD) = matrix.shape
    if maxN >= xD:
        x = maxN//xD
        y = maxN % xD
    else:
        y = maxN
        x = 0
    return (x,y)
iFederx
fuente
0

Una forma alternativa es cambiar la numpymatriz listy usar maxy indexmétodos:

List = np.array([34, 7, 33, 10, 89, 22, -5])
_max = List.tolist().index(max(List))
_max
>>> 4

fuente