web-dev-qa-db-fra.com

Réorganiser les colonnes du tableau 2D numpy

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.

43
5xum

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.

67
wim

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)
3
Parth Paritosh