165 votes

Numpy argsort - que fait-il ?

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.

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

1voto

hoosierEE Points 500

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.

0voto

D'abord, on a commandé le tableau. Ensuite, on génère un tableau avec l'indice initial du tableau.

0voto

Multihunter Points 1292

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.

0 votes

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.

1 votes

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é.

0voto

vivek Points 124

Np.argsort retourne l'index du tableau trié donné par le 'kind' (qui spécifie le type d'algorithme de tri). Cependant, lorsqu'une liste est utilisée avec np.argmax, elle renvoie l'indice du plus grand élément de la liste. Alors que, np.sort, trie le tableau donné, list.

0voto

nucsit026 Points 572

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.com

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.

Powered by:

X