Pourquoi numpy donne-t-il ce résultat :
x = numpy.array([1.48,1.41,0.0,0.1])
print x.argsort()
>[2 3 1 0]
alors que je m'attendais à ce qu'il le fasse :
[3 2 0 1]
Il est clair que ma compréhension de la fonction est insuffisante.
Pourquoi numpy donne-t-il ce résultat :
x = numpy.array([1.48,1.41,0.0,0.1])
print x.argsort()
>[2 3 1 0]
alors que je m'attendais à ce qu'il le fasse :
[3 2 0 1]
Il est clair que ma compréhension de la fonction est insuffisante.
Pour ceux qui se demandent "pourquoi argsort", ma réponse est "utiliser un tableau pour en trier un autre" :
In [49]: a = np.array(list('asdf'))
In [50]: b = [3,2,0,1]
In [51]: np.argsort(b)
Out[51]: array([2, 3, 1, 0])
In [52]: a[np.argsort(b)]
Out[52]: array(['d', 'f', 's', 'a'], dtype='<U1')
C'est idéal pour les données en colonnes, par exemple une colonne de noms et une colonne de salaires, et vous voulez voir les noms des N personnes les mieux payées.
Je veux juste comparer directement la compréhension originale du PO avec la mise en œuvre réelle du code.
numpy.argsort
est défini de telle sorte que pour les tableaux 1D :
x[x.argsort()] == numpy.sort(x) # this will be an array of True's
L'OP pensait à l'origine qu'il était défini de telle sorte que pour les tableaux 1D :
x == numpy.sort(x)[x.argsort()] # this will not be True
Nota: Ce code ne fonctionne pas dans le cas général (il ne fonctionne que pour 1D), cette réponse est purement illustrative.
x[x.argsort()]
n'est pas nécessairement identique à np.sort(x)
. En fait, il ne s'agit pas nécessairement de la même forme. Essayez avec un tableau 2D. Cela ne fonctionne qu'avec les tableaux 1D.
J'ai l'impression que c'est inutilement pédant. La question porte sur les tableaux 1D. Il s'agit de comprendre quelle est la différence, plutôt que d'utiliser un code littéral. De plus, lorsque vous avez un tableau 2D, il n'est même pas évident de savoir quel type de tri vous voulez. Voulez-vous un tri global ? Si ce n'est pas le cas, quel axe doit être trié ? Quoi qu'il en soit, j'ai ajouté une clause de non-responsabilité.
Il retourne les indices en fonction des indices du tableau donné, [1.48,1.41,0.0,0.1]
,cela veut dire : 0.0
est le premier élément, en indice [2]. 0.1
est le deuxième élément, en indice [3]. 1.41
est le troisième élément, en indice [1]. 1.48
est le quatrième élément, dans l'index [0]. Sortie :
[2,3,1,0]
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
9 votes
Pourquoi avez-vous pensé que
[3 2 0 1]
aurait été la bonne réponse ?12 votes
J'avais simplement une compréhension inversée de la sortie. Par exemple, si vous prenez le premier élément de x, il devrait être en position 3 d'un tableau trié et ainsi de suite.
39 votes
Votre façon de penser est tout à fait logique, j'ai eu exactement la même question
7 votes
[3 2 0 1] - il s'agit d'un classement des valeurs, vous n'obtenez pas les indices réels.
2 votes
Rappelez-vous que la sortie indique les emplacements dans le tableau original alors que vous pensez qu'il s'agit du tableau trié. Cela signifie que output[0] est l'index où se trouve le plus petit élément du tableau d'entrée original et output[-1] pour l'élément le plus grand.
0 votes
Vous avez essayé de les classer, pas de les trier.