Numpy: argsort ne fonctionne pas pour les tableaux multidimensionnels

Créé le 19 mai 2014  ·  12Commentaires  ·  Source: numpy/numpy

considérez le code suivant :
a = np.aléatoire.aléatoire([5,5])
ind = np.argsort(a, axe=1)
a_sorted = a[ind]
np.sort(a, axe=1)

maintenant a_sorted et a devraient être tous les deux triés le long de l'axe 1. Cependant, même les formes ne sont plus identiques. a est toujours de (5,5) tandis que a_sorted est de (5,5,5). Si c'est le comportement voulu, quelqu'un peut-il me dire pourquoi ?

Commentaire le plus utile

Ce serait bien s'il y avait un exemple sur la façon d'utiliser réellement la sortie pour trier le tableau ND.

Ce serait aussi bien s'il y avait une solution plus lisible que a[np.arange(np.shape(a)[0])[:,np.newaxis], np.argsort(a)]

Tous les 12 commentaires

argsort() fonctionne bien, mais l'indexation ne fonctionne pas comme vous l'attendez.

http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#advanced -indexing

Essaye ça:

a = np.random.random([5,5])
i = np.arange(len(a))[:, np.newaxis]
j = np.argsort(a, axis=1)
a_sorted = a[i, j]
np.sort(a, axis=1)

J'étais confus de la même manière. La documentation indique spécifiquement,

Retour
index_array : ndarray, entier
Tableau d'indices qui trient a long de l'axe spécifié.
En d'autres termes, a[index_array] donne un a trié.

Ce qui ne s'applique qu'à un tableau 1D. La documentation doit-elle être étendue pour préciser que ce n'est pas le cas pour les baies ND ?

@lzkelley Oui, un patch pour améliorer la documentation serait le bienvenu.

@shoyer cool, je vais faire un PR pour ça et mettre à jour

Ce serait bien s'il y avait un exemple sur la façon d'utiliser réellement la sortie pour trier le tableau ND.

Ce serait aussi bien s'il y avait une solution plus lisible que a[np.arange(np.shape(a)[0])[:,np.newaxis], np.argsort(a)]

Peut-être que @seberg pourrait en faire l'un de ses ajouts de fonction d'indexation.

Je ne pense pas que cela convienne très clairement à l'indexation, une fonction de sélection ou alors est probablement une correspondance plus facile.

+1 pour une nouvelle fonction.

L'objectif de argsort (par opposition à sort ) ne doit-il pas être utilisé pour l'indexation ?

argsort fournit les index pour trier le long d'un axe, mais en fait, trier le long de cet axe à l'aide des index semble inutilement verbeux. A moins qu'il existe un moyen plus simple que je ne connais pas.

une fonction de sélection ou alors est probablement une correspondance plus facile.

C'est #8708

Cette page vous a été utile?
0 / 5 - 0 notes