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?


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)

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


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)

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)

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.