num PY: Quelle est la logique des fonctions argmin() et argmax ()?
Je ne peux pas comprendre la sortie de argmax
et argmin
lorsqu'il est utilisé avec le paramètre axis. Par exemple:
>>> 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])
Comme vous pouvez le voir, la valeur maximale est le point (1,1) et le minimum est le point (0,0). Donc dans ma logique, quand je le lance:
np.argmin(a,axis=0)
je m'attendaisarray([0,0,0,0])
np.argmin(a,axis=1)
je m'attendaisarray([0,0,0])
np.argmax(a,axis=0)
je m'attendaisarray([1,1,1,1])
np.argmax(a,axis=1)
je m'attendaisarray([1,1,1])
Ce qui ma compréhension des choses est-elle erronée?
5 réponses
en ajoutant le axis
argument, NumPy regarde les lignes et les colonnes individuellement. Quand il n'est pas donné, le tableau a
est aplati en un seul tableau 1D.
axis=0
signifie que l'opération est effectuée bas les colonnes d'un tableau 2D a
à son tour.
Par exemple np.argmin(a, axis=0)
renvoie l'index de la valeur minimum dans chacun des quatre colonnes. La valeur minimale de chaque colonne est indiqué dans gras ci-dessous:
>>> 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])
d'autre part, axis=1
signifie que l'opération est effectuée dans les rangées de a
.
cela signifie np.argmin(a, axis=1)
retourne [0, 2, 2]
parce que a
a trois lignes. L'indice de la valeur minimale dans la première rangée est 0, l'indice de la valeur minimale de la deuxième et troisième lignes est de 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])
np.argmax
fonction par défaut fonctionne le long de la aplati tableau, sauf si vous spécifiez un axe. Pour voir ce qui se passe vous pouvez utiliser flatten
explicitement:
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
j'ai numéroté les indices sous le tableau ci-dessus pour le rendre plus clair. Notez que les indices sont numérotés de zéro en numpy
.
Dans le cas où vous spécifiez l'axe, il est également fonctionne comme prévu:
np.argmax(a,axis=0)
>>> array([1, 1, 1, 1])
cela vous indique que la plus grande valeur est dans la rangée 1
(2ème valeur), pour chaque colonne le long de axis=0
(vers le bas). Vous pouvez voir plus clairement si vous modifiez vos données un peu:
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])
comme vous pouvez le voir, il identifie maintenant la valeur maximale dans la rangée 0 pour la colonne 1, la rangée 1 pour les colonnes 2 et 3 et la rangée 3 pour la colonne 4.
il existe un guide utile pour numpy
indexation dans le documentation.
en tant que note secondaire: si vous voulez trouver les coordonnées de votre valeur maximale dans le tableau complet, vous pouvez utiliser
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)
""" ....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]
l'axe dans l'argument de la fonction argmax, se réfère à l'axe le long duquel le tableau sera découpé.
Dans un autre mot, np.argmin(a,axis=0)
c'est effectivement le même que np.apply_along_axis(np.argmin, 0, a)
, c'est-à-dire trouver l'emplacement minimum de ces vecteurs tranchés le long de l'axe=0.
donc dans votre exemple,np.argmin(a, axis=0)
[0, 0, 2, 2]
qui correspondant à des valeurs de [1, 2, 3, 4]
sur les colonnes respectives