Pourquoi pensez-vous que [3 2 0 1]cela aurait été la bonne réponse?
zwol
9
Je viens d'avoir 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.
user1276273
26
votre façon de penser a tout à fait un sens, j'avais exactement la même question
adrienlucca.wordpress.com
2
[3 2 0 1] - il s'agit de classer les valeurs, vous n'obtenez pas les indices réels.
Lahiru Karunaratne
Rappelez-vous simplement que la sortie indique des emplacements dans le tableau d'origine alors que vous le pensez dans le tableau trié. Cela signifie que la sortie [0] est l'index où le plus petit élément du tableau d'entrée d'origine localise et la sortie [-1] pour le plus grand élément.
Ces %timeitbenchmarks IPython suggèrent que pour les grands tableaux, using_indexed_assignmentc'est le plus rapide:
In[50]: x = np.random.random(10**5)In[66]:%timeit using_indexed_assignment(x)100 loops, best of 3:9.32 ms per loop
In[70]:%timeit using_rankdata(x)100 loops, best of 3:10.6 ms per loop
In[56]:%timeit using_argsort_twice(x)100 loops, best of 3:16.2 ms per loop
In[59]:%timeit using_digitize(x)10 loops, best of 3:27 ms per loop
Pour les petits tableaux, using_argsort_twicepeut être plus rapide:
In[78]: x = np.random.random(10**2)In[81]:%timeit using_argsort_twice(x)100000 loops, best of 3:3.45µs per loop
In[79]:%timeit using_indexed_assignment(x)100000 loops, best of 3:4.78µs per loop
In[80]:%timeit using_rankdata(x)100000 loops, best of 3:19µs per loop
In[82]:%timeit using_digitize(x)10000 loops, best of 3:26.2µs per loop
Notez également que cela stats.rankdatavous donne plus de contrôle sur la façon de gérer les éléments de valeur égale.
Pouvez-vous ajouter quelques explications sur la raison pour laquelle appliquer argsort () deux fois nous donne le rang?
Phani
1
@Phani: argsortretourne les indices du tableau trié. L'index des indices triés est le rang. C'est ce que argsortretourne le deuxième appel .
unutbu
2
Le premier tri d'arguments renvoie une permutation (qui, si elle était appliquée aux données, les trierait). Lorsque argsort est appliqué à (telle ou telle) permutation, il renvoie la permutation inverse (que si les 2 permutations sont appliquées l'une à l'autre dans l'un ou l'autre ordre, le résultat est l'identité). La deuxième permutation, si elle est appliquée à un tableau de données triées, produirait le tableau de données non triées, c'est-à-dire qu'il s'agit du rang.
Alex C
1
L'esprit soufflé. J'ai enfin compris! Il retourne un tableau dont le contenu correspond aux indices du tableau d'origine dans un ordre trié.
Cela signifie que le premier élément de argsort est l'index de l'élément qui doit être trié en premier, le deuxième élément est l'index de l'élément qui devrait être le deuxième, etc.
Ce que vous semblez vouloir, c'est l'ordre de classement des valeurs, qui est fourni par scipy.stats.rankdata. Notez que vous devez réfléchir à ce qui devrait se passer s'il y a des liens dans les rangs.
Effectuez un tri indirect le long de l'axe donné en utilisant l'algorithme spécifié par le mot-clé kind. Il renvoie un tableau d'indices de la même forme que ces données d'index le long de l'axe donné dans l'ordre trié.
Prenons un exemple en python, ayant une liste de valeurs comme
listExample =[0,2,2456,2000,5000,0,1]
Maintenant, nous utilisons la fonction argsort:
import numpy as np
list(np.argsort(listExample))
La sortie sera
[0,5,6,1,3,2,4]
Voici la liste des indices de valeurs dans listExample si vous mappez ces indices aux valeurs respectives, nous obtiendrons le résultat comme suit:
[0,0,1,2,2000,2456,5000]
(Je trouve cette fonction très utile dans de nombreux endroits, par exemple si vous voulez trier la liste / le tableau mais ne voulez pas utiliser la fonction list.sort () (c'est-à-dire sans changer l'ordre des valeurs réelles dans la liste), vous pouvez l'utiliser fonction.)
Bien que cet extrait de code puisse être la solution, inclure une explication contribue vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code.
peacetype
0
Tout d'abord, il a été commandé le tableau. Générez ensuite un tableau avec l'index initial du tableau.
np.argsort renvoie 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'index du plus grand élément de la liste. Alors que, np.sort, trie le tableau donné, list.
x[x.argsort()]n'est pas nécessairement le même que np.sort(x). En fait, ce n'est même pas nécessairement la même forme. Essayez ceci avec un tableau 2D. Cela ne fonctionne qu'avec des baies 1D.
Nathan
J'ai l'impression que c'est inutilement pédant. La question concerne les tableaux 1D. C'est un moyen de comprendre quelle était la différence, plutôt que du code littéral à utiliser. De plus, lorsque vous avez un tableau 2D, le type de tri souhaité n'est même pas clair. Voulez-vous un tri global? Sinon, quel axe doit être trié? Quoi qu'il en soit, j'ai ajouté un avertissement.
Multihunter
0
Il renvoie des indices en fonction des indices de tableau donnés,, [1.48,1.41,0.0,0.1]c'est-à-dire:
0.0est le premier élément, dans l'index [2].
0.1est le deuxième élément, dans l'index [3].
1.41est le troisième élément, dans l'index [1].
1.48est le quatrième élément, dans l'index [0]. Production:
[3 2 0 1]
cela aurait été la bonne réponse?Réponses:
Selon la documentation
2
est l'indice de0.0
.3
est l'indice de0.1
.1
est l'indice de1.41
.0
est l'indice de1.48
.la source
a = x.argsort()
, imprimerx[a]
, nous obtiendronsarray([ 0. , 0.1 , 1.41, 1.48])
[2, 3, 1, 0]
indique que le plus petit élément est à l'index 2, le plus petit suivant à l'index 3, puis l'index 1, puis l'index 0.Il existe plusieurs façons d'obtenir le résultat que vous recherchez:
Par exemple,
Cela vérifie qu'ils produisent tous le même résultat:
Ces
%timeit
benchmarks IPython suggèrent que pour les grands tableaux,using_indexed_assignment
c'est le plus rapide:Pour les petits tableaux,
using_argsort_twice
peut être plus rapide:Notez également que cela
stats.rankdata
vous donne plus de contrôle sur la façon de gérer les éléments de valeur égale.la source
argsort
retourne les indices du tableau trié. L'index des indices triés est le rang. C'est ce queargsort
retourne le deuxième appel .Comme la documentation dit
argsort
:Cela signifie que le premier élément de argsort est l'index de l'élément qui doit être trié en premier, le deuxième élément est l'index de l'élément qui devrait être le deuxième, etc.
Ce que vous semblez vouloir, c'est l'ordre de classement des valeurs, qui est fourni par
scipy.stats.rankdata
. Notez que vous devez réfléchir à ce qui devrait se passer s'il y a des liens dans les rangs.la source
numpy.argsort (a, axis = -1, kind = 'quicksort', order = None)
Renvoie les indices qui trieraient un tableau
Effectuez un tri indirect le long de l'axe donné en utilisant l'algorithme spécifié par le mot-clé kind. Il renvoie un tableau d'indices de la même forme que ces données d'index le long de l'axe donné dans l'ordre trié.
Prenons un exemple en python, ayant une liste de valeurs comme
Maintenant, nous utilisons la fonction argsort:
La sortie sera
Voici la liste des indices de valeurs dans listExample si vous mappez ces indices aux valeurs respectives, nous obtiendrons le résultat comme suit:
(Je trouve cette fonction très utile dans de nombreux endroits, par exemple si vous voulez trier la liste / le tableau mais ne voulez pas utiliser la fonction list.sort () (c'est-à-dire sans changer l'ordre des valeurs réelles dans la liste), vous pouvez l'utiliser fonction.)
Pour plus de détails, référez-vous à ce lien: https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.argsort.html
la source
input:
import numpy as np
x = np.array ([1.48,1.41,0.0,0.1])
x.argsort (). argsort ()
sortie:
tableau ([3, 2, 0, 1])
la source
Tout d'abord, il a été commandé le tableau. Générez ensuite un tableau avec l'index initial du tableau.
la source
np.argsort renvoie 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'index du plus grand élément de la liste. Alors que, np.sort, trie le tableau donné, list.
la source
Je veux juste comparer directement la compréhension originale du PO avec l'implémentation réelle avec du code.
numpy.argsort
est défini de telle sorte que pour les tableaux 1D:L'OP pensait à l'origine qu'il était défini de telle sorte que pour les tableaux 1D:
Remarque: ce code ne fonctionne pas dans le cas général (ne fonctionne que pour 1D), cette réponse est purement à des fins d'illustration.
la source
x[x.argsort()]
n'est pas nécessairement le même quenp.sort(x)
. En fait, ce n'est même pas nécessairement la même forme. Essayez ceci avec un tableau 2D. Cela ne fonctionne qu'avec des baies 1D.Il renvoie des indices en fonction des indices de tableau donnés,,
[1.48,1.41,0.0,0.1]
c'est-à-dire:0.0
est le premier élément, dans l'index [2].0.1
est le deuxième élément, dans l'index [3].1.41
est le troisième élément, dans l'index [1].1.48
est le quatrième élément, dans l'index [0]. Production:la source