python - argsort - numpy: ¿cuál es la lógica de las funciones argmin() y argmax()?
numpy argmin (5)
No puedo entender la salida de argmax
y argmin
cuando se usa con el parámetro axis. Por ejemplo:
>>> a = np.array([[1,2,4,7], [9,88,6,45], [9,76,3,4]])
>>> a
array([[ 1, 2, 4, 7],
[ 9, 88, 6, 45],
[ 9, 76, 3, 4]])
>>> a.shape
(3, 4)
>>> a.size
12
>>> np.argmax(a)
5
>>> np.argmax(a,axis=0)
array([1, 1, 1, 1])
>>> np.argmax(a,axis=1)
array([3, 1, 1])
>>> np.argmin(a)
0
>>> np.argmin(a,axis=0)
array([0, 0, 2, 2])
>>> np.argmin(a,axis=1)
array([0, 2, 2])
Como puede ver, el valor máximo es el punto (1,1) y el mínimo es el punto (0,0). Así que en mi lógica cuando corro:
-
np.argmin(a,axis=0)
array([0,0,0,0])
-
np.argmin(a,axis=1)
array([0,0,0])
-
np.argmax(a,axis=0)
Iarray([1,1,1,1])
esperadoarray([1,1,1,1])
-
np.argmax(a,axis=1)
Iarray([1,1,1])
esperadoarray([1,1,1])
¿Qué hay de malo en mi comprensión de las cosas?
Al agregar el argumento del axis
, NumPy mira las filas y columnas individualmente. Cuando no se proporciona, la matriz a
se aplana en una única matriz 1D.
axis=0
significa que la operación se realiza en las columnas de una matriz 2D a su vez.
Por ejemplo, np.argmin(a, axis=0)
devuelve el índice del valor mínimo en cada una de las cuatro columnas. El valor mínimo en cada columna se muestra en negrita a continuación:
>>> a
array([[ 1, 2, 4, 7], # 0
[ 9, 88, 6, 45], # 1
[ 9, 76, 3, 4]]) # 2
>>> np.argmin(a, axis=0)
array([0, 0, 2, 2])
Por otro lado, axis=1
significa que la operación se realiza a través de las filas de a
.
Eso significa que np.argmin(a, axis=1)
devuelve [0, 2, 2]
porque a
tiene tres filas. El índice del valor mínimo en la primera fila es 0, el índice del valor mínimo de la segunda y tercera filas es 2:
>>> a
# 0 1 2 3
array([[ 1, 2, 4, 7],
[ 9, 88, 6, 45],
[ 9, 76, 3, 4]])
>>> np.argmin(a, axis=1)
array([0, 2, 2])
Como nota adicional: si desea encontrar las coordenadas de su valor máximo en la matriz completa, puede usar
a=np.array([[1,2,4,7],[9,88,6,45],[9,76,3,4]])
>>> a
[[ 1 2 4 7]
[ 9 88 6 45]
[ 9 76 3 4]]
c=(np.argmax(a)/len(a[0]),np.argmax(a)%len(a[0]))
>>> c
(1, 1)
El eje en el argumento de la función argmax, se refiere al eje a lo largo del cual se dividirá la matriz.
En otra palabra, np.argmin(a,axis=0)
es efectivamente lo mismo que np.apply_along_axis(np.argmin, 0, a)
, que es encontrar la ubicación mínima para estos vectores cortados en el eje = 0.
Por lo tanto, en su ejemplo, np.argmin(a, axis=0)
es [0, 0, 2, 2]
que corresponde a los valores de [1, 2, 3, 4]
en las columnas respectivas
La función np.argmax
por defecto funciona a lo largo de la matriz aplanada , a menos que especifique un eje. Para ver lo que está sucediendo puede usar flatten
explícitamente:
np.argmax(a)
>>> 5
a.flatten()
>>>> array([ 1, 2, 4, 7, 9, 88, 6, 45, 9, 76, 3, 4])
0 1 2 3 4 5
He numerado los índices debajo de la matriz de arriba para hacerlo más claro. Tenga en cuenta que los índices están numerados desde cero en numpy
.
En los casos en que especifique el eje, también funciona como se esperaba:
np.argmax(a,axis=0)
>>> array([1, 1, 1, 1])
Esto le indica que el valor más grande está en la fila 1
(segundo valor), para cada columna a lo largo del axis=0
(abajo). Puede ver esto más claramente si cambia sus datos un poco:
a=np.array([[100,2,4,7],[9,88,6,45],[9,76,3,100]])
a
>>> array([[100, 2, 4, 7],
[ 9, 88, 6, 45],
[ 9, 76, 3, 100]])
np.argmax(a, axis=0)
>>> array([0, 1, 1, 2])
Como puede ver, ahora identifica el valor máximo en la fila 0 para la columna 1, la fila 1 para la columna 2 y 3 y la fila 3 para la columna 4.
Hay una guía útil para la indexación numpy
en la documentation .
""" ....READ THE COMMENTS FOR CLARIFICATION....."""
import numpy as np
a = np.array([[1,2,4,7], [9,88,6,45], [9,76,3,4]])
"""np.argmax(a) will give index of max value in flatted array of given matrix """
>>np.arg(max)
5
"""np.argmax(a,axis=0) will return list of indexes of max value column-wise"""
>>print(np.argmax(a,axis=0))
[1,1,1,1]
"""np.argmax(a,axis=1) will return list of indexes of max value row-wise"""
>>print(np.argmax(a,axis=1))
[3,1,1]
"""np.argmin(a) will give index of min value in flatted array of given matrix """
>>np.arg(min)
0
"""np.argmin(a,axis=0) will return list of indexes of min value column-wise"""
>>print(np.argmin(a,axis=0))
[0,0,2,2]
"""np.argmin(a,axis=0) will return list of indexes of min value row-wise"""
>>print(np.argmin(a,axis=1))
[0,2,2]