En este tutorial, aprenderá a utilizar la función argmax() de NumPy para hallar el índice del elemento máximo en matrices.
NumPy es una potente biblioteca para la computación científica en Python; proporciona matrices N-dimensionales que son más performantes que las listas de Python. Una de las operaciones comunes que realizará cuando trabaje con matrices NumPy es encontrar el valor máximo de la matriz. Sin embargo, a veces querrá encontrar el índice en el que se produce el valor máximo.
La función argmax(
) le ayuda a encontrar el índice del máximo tanto en matrices unidimensionales como multidimensionales. Procedamos a aprender cómo funciona.
Cómo hallar el índice del elemento máximo en una matriz NumPy
Para seguir este tutorial, necesita tener instalados Python y NumPy. Usted puede codificar a lo largo de iniciar un Python REPL o el lanzamiento de un cuaderno Jupyter.
En primer lugar, vamos a importar NumPy bajo el alias habitual np
.
importar numpy como np
Puede utilizar la función NumPy max()
para obtener el valor máximo de una matriz (opcionalmente a lo largo de un eje específico).
array_1 = np.array([1,5,7,2,10,9,8,4])
print(np.max(array_1))
# Salida
10
En este caso, np.max(array_1)
devuelve 10, lo que es correcto.
Supongamos que desea encontrar el índice en el que se produce el valor máximo en la matriz. Puede adoptar el siguiente enfoque en dos pasos:
- Encuentre el elemento máximo.
- Encuentre el índice del elemento máximo.
En array_1
, el valor máximo de 10 se produce en el índice 4, siguiendo la indexación cero. El primer elemento está en el índice 0; el segundo elemento está en el índice 1, y así sucesivamente.
Para encontrar el índice en el que se produce el máximo, puede utilizar la función NumPy where(). np.where(condition)
devuelve un array de todos los índices en los que la condición
es True
.
Tendrá que pinchar en la matriz y acceder al elemento en el primer índice. Para encontrar dónde se produce el valor máximo, establecemos la condición
en array_1==10
; recuerde que 10 es el valor máximo en array_1
.
print(int(np.where(array_1==10)[0])
# Salida
4
Hemos utilizado np.where()
sólo con la condición, pero éste no es el método recomendado para utilizar esta función.
📑 Nota: Función NumPy where():
np.where(condición,x,y
) devuelve:– Elementos de
x
cuando la condición esVerdadera
, y
– Elementos dey
cuando la condición esFalsa
.
Por lo tanto, encadenando las funciones np .max()
y np.where()
, podemos encontrar el elemento máximo, seguido del índice en el que se produce.
En lugar del proceso anterior de dos pasos, puede utilizar la función NumPy argmax() para obtener el índice del elemento máximo de la matriz.
Sintaxis de la función NumPy argmax()
La sintaxis general para utilizar la función NumPy argmax() es la siguiente:
np.argmax(array,eje,out)
# hemos importado numpy con el alias np
En la sintaxis anterior
- array es cualquier array válido de NumPy.
- axis es un parámetro opcional. Cuando se trabaja con matrices multidimensionales, puede utilizar el parámetro axis para encontrar el índice de máximo a lo largo de un eje específico.
- out es otro parámetro opcional. Puede establecer el parámetro
out
en una matriz NumPy para almacenar la salida de la funciónargmax()
.
Nota: A partir de la versión 1.22.0 de NumPy, existe un parámetro
keepdims
adicional. Cuando especificamos el parámetroaxis
en la llamada a la función argmax()
, la matriz se reduce a lo largo de ese eje. Pero establecer el parámetrokeepdims
enTrue
garantiza que la salida devuelta tenga la misma forma que la matriz de entrada.
Uso de NumPy argmax() para hallar el índice del elemento máximo
#1. Utilicemos la función NumPy argmax() para hallar el índice del elemento máximo en array_1
.
array_1 = np.array([1,5,7,2,10,9,8,4])
print(np.argmax(array_1))
# Salida
4
La función argmax (
) devuelve 4, ¡lo cual es correcto! ✅
#2. Si redefinimos array_1
de forma que 10 aparezca dos veces, la función argmax
() devuelve sólo el índice de la primera aparición.
array_1 = np.array([1,5,7,2,10,10,8,4])
print(np.argmax(array_1))
# Salida
4
Para el resto de los ejemplos, utilizaremos los elementos de array_1
que definimos en el ejemplo nº 1.
Uso de NumPy argmax() para hallar el índice del elemento máximo en una matriz 2D
Vamos a remodelar la matriz array_1
de Num Py para convertirla en una matriz bidimensional con dos filas y cuatro columnas.
array_2 = array_1.reshape(2,4)
print(array_2)
# Salida
[[ 1 5 7 2]
[10 9 8 4]]
Para un array bidimensional, el eje 0 denota las filas y el eje 1 las columnas. Las matrices NumPy siguen un índice cero. Así que los índices de las filas y columnas para el array_2
de NumPy son los siguientes:
Ahora, llamemos a la función argmax ()
en la matriz bidimensional, array_2
.
print(np.argmax(matriz_2))
# Salida
4
Aunque hayamos llamado a argmax( )
en la matriz bidimensional, sigue devolviendo 4. Esto es idéntico a la salida para la matriz unidimensional, array_1
de la sección anterior.
¿Por qué ocurre esto? 🤔
Esto se debe a que no hemos especificado ningún valor para el parámetro eje. Cuando no se establece este parámetro de eje, por defecto, la función argmax(
) devuelve el índice del elemento máximo a lo largo de la matriz aplanada.
¿Qué es una matriz aplanada? Si existe una matriz de N dimensiones de forma d1 x d2 x … x dN, donde d1, d2, hasta dN son los tamaños de la matriz a lo largo de las N dimensiones, entonces la matriz aplanada es una matriz unidimensional larga de tamaño d1 * d2 * … * dN.
Para comprobar el aspecto de la matriz aplanada para array_2
, puede llamar al método flatten(
), como se muestra a continuación:
array_2.flatten()
# Salida
array([ 1, 5, 7, 2, 10, 9, 8, 4])
Índice del elemento máximo a lo largo de las filas (eje = 0)
Procedamos a hallar el índice del elemento máximo a lo largo de las filas (eje = 0).
np.argmax(array_2,axis=0)
# Salida
array([1, 1, 1, 1])
Esta salida puede ser un poco difícil de comprender, pero vamos a entender cómo funciona.
Hemos puesto el parámetro eje
a cero(eje =
0), ya que queremos encontrar el índice del elemento máximo a lo largo de las filas. Por lo tanto, la función argmax(
) devuelve el número de fila en la que se produce el elemento máximo-para cada una de las tres columnas.
Visualicemos esto para comprenderlo mejor.
A partir del diagrama anterior y de la salida de argmax
(), tenemos lo siguiente:
- Para la primera columna en el índice 0, el valor máximo 10 se produce en la segunda fila, en el índice = 1.
- Para la segunda columna en el índice 1, el valor máximo 9 se produce en la segunda fila, en el índice = 1.
- Para la tercera y cuarta columnas en los índices 2 y 3, los valores máximos 8 y 4 ocurren ambos en la segunda fila, en el índice = 1.
Esta es precisamente la razón por la que tenemos la matriz de
salida ([1, 1, 1, 1])
porque el elemento máximo a lo largo de las filas se produce en la segunda fila (para todas las columnas).
Índice del elemento máximo a lo largo de las columnas (eje = 1)
A continuación, utilicemos la función argmax()
para hallar el índice del elemento máximo a lo largo de las columnas.
Ejecute el siguiente fragmento de código y observe la salida.
np.argmax(array_2,axis=1)
array([2, 0])
¿Puede analizar la salida?
Hemos fijado axis
= 1 para calcular el índice del elemento máximo a lo largo de las columnas.
La función argmax(
) devuelve, para cada fila, el número de columna en el que se produce el valor máximo.
He aquí una explicación visual:
A partir del diagrama anterior y de la salida de argmax
(), tenemos lo siguiente:
- Para la primera fila en el índice 0, el valor máximo 7 se produce en la tercera columna, en el índice = 2.
- Para la segunda fila en el índice 1, el valor máximo 10 se produce en la primera columna, en el índice = 0.
Espero que ahora entienda lo que significa la salida, array([2, 0])
.
Uso del parámetro opcional out en NumPy argmax()
Puede utilizar el parámetro opcional out
en la función NumPy argmax() para almacenar la salida en una matriz NumPy.
Inicialicemos una matriz de ceros para almacenar la salida de la anterior llamada a la función argmax( )
– para encontrar el índice del máximo a lo largo de las columnas(eje= 1
).
out_arr = np.zeros((2,))
print(out_arr)
[0. 0.]
Ahora, volvamos al ejemplo de encontrar el índice del elemento máximo a lo largo de las columnas(
eje = 1) y establezcamos el out
a out_arr
que hemos definido anteriormente.
np.argmax(array_2,axis=1,out=out_arr)
Vemos que el intérprete de Python lanza un TypeError
, ya que out_arr
se inicializó a una matriz de flotantes por defecto.
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/usr/local/lib/python3.7/dist-packages/numpy/core/fromnumeric.py in _wrapfunc(obj, method, *args, **kwds)
56 try:
--->
57 return bound(*args, **kwds)
58 except TypeError:
TypeError: Cannot cast array data from dtype('float64') to dtype('int64') according to the rule 'safe'
Por lo tanto, al establecer el parámetro out
en la matriz de salida, es importante asegurarse de que la matriz de salida tiene la forma y el tipo de datos correctos. Como los índices de las matrices son siempre enteros, debemos establecer el parámetro dtype
en int
al definir la matriz de salida.
out_arr = np.zeros((2,),dtype=int)
print(out_arr)
# Salida
[0 0]
Ahora podemos seguir adelante y llamar a la función argmax ()
con los parámetros axis
y out
, y esta vez, se ejecuta sin error.
np.argmax(array_2,axis=1,out=out_arr)
Ahora se puede acceder a la salida de la función argmax
() en la matriz out_arr
.
print(out_arr)
# Salida
[2 0]
Conclusión
Espero que este tutorial le haya ayudado a entender cómo utilizar la función argmax() de NumPy. Puede ejecutar los ejemplos de código en un cuaderno Jupyter.
Repasemos lo que hemos aprendido.
- La función NumPy argmax() devuelve el índice del elemento máximo de una matriz. Si el elemento máximo aparece más de una vez en una matriz a, entonces np.argmax(a) devuelve el índice de la primera aparición del elemento.
- Cuando trabaje con matrices multidimensionales, puede utilizar el parámetro opcional axis para obtener el índice del elemento máximo a lo largo de un eje concreto. Por ejemplo, en una matriz bidimensional: estableciendo eje = 0 y eje = 1, puede obtener el índice del elemento máximo a lo largo de las filas y las columnas, respectivamente.
- Si desea almacenar el valor devuelto en otra matriz, puede establecer el parámetro opcional out en la matriz de salida. No obstante, la matriz de salida debe tener una forma y un tipo de datos compatibles.
A continuación, consulte la guía en profundidad sobre conjuntos de Python. Aprenda también a utilizar la función Sleep de Py thon para añadir retardos a su código.