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'attendais array([0,0,0,0])
  • np.argmin(a,axis=1) je m'attendais array([0,0,0])
  • np.argmax(a,axis=0) je m'attendais array([1,1,1,1])
  • np.argmax(a,axis=1) je m'attendais array([1,1,1])

Ce qui ma compréhension des choses est-elle erronée?

20
demandé sur Alex Riley 2015-02-24 17:10:57

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])
32
répondu Alex Riley 2018-03-18 10:04:47

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.

4
répondu mfitzp 2015-02-24 14:30:38

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)
4
répondu MartijnVanAttekum 2016-02-02 16:30:21
""" ....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]
1
répondu Nitin Ashutosh 2018-07-05 04:49:58

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

0
répondu xingzhi.sg 2015-02-24 14:26:54