argsort argmin python arrays numpy argmax

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) I array([1,1,1,1]) esperado array([1,1,1,1])
  • np.argmax(a,axis=1) I array([1,1,1]) esperado array([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]