Existe-t-il un moyen de changer l'ordre des colonnes d'un tableau 2D numpy en un nouvel ordre arbitraire? Par exemple, j'ai un tableau
array([[10, 20, 30, 40, 50],
[ 6, 7, 8, 9, 10]])
et je veux le changer, disons
array([[10, 30, 50, 40, 20],
[ 6, 8, 10, 9, 7]])
en appliquant la permutation
0 -> 0
1 -> 4
2 -> 1
3 -> 3
4 -> 2
sur les colonnes. Dans la nouvelle matrice, je veux donc que la première colonne de l'original reste en place, la seconde se déplace vers la dernière colonne et ainsi de suite.
Existe-t-il une fonction numpy pour le faire? J'ai une matrice assez grande et je m'attends à en obtenir de plus grandes, j'ai donc besoin d'une solution qui le fasse rapidement et en place si possible (les matrices de permutation sont à proscrire)
Merci.
Ceci est possible en utilisant une indexation sophistiquée:
>>> import numpy as np
>>> a = np.array([[10, 20, 30, 40, 50],
... [ 6, 7, 8, 9, 10]])
>>> your_permutation = [0,4,1,3,2]
>>> i = np.argsort(your_permutation)
>>> i
array([0, 2, 4, 3, 1])
>>> a[:,i]
array([[10, 30, 50, 40, 20],
[ 6, 8, 10, 9, 7]])
Notez qu'il s'agit d'une copie et non d'une vue. Une permutation sur place n'est pas possible dans le cas général, en raison de la façon dont les tableaux numpy sont foulés en mémoire.
J'ai une solution basée sur une matrice pour cela, en post-multipliant une matrice de permutation à l'originale. Cela change la position des éléments dans la matrice d'origine
import numpy as np
a = np.array([[10, 20, 30, 40, 50],
[ 6, 7, 8, 9, 10]])
# Create the permutation matrix by placing 1 at each row with the column to replace with
your_permutation = [0,4,1,3,2]
perm_mat = np.zeros((len(your_permutation), len(your_permutation)))
for idx, i in enumerate(your_permutation):
perm_mat[idx, i] = 1
print np.dot(a, perm_mat)