it-swarm.com.de

Ordnen Sie die Spalten des numpy 2D-Arrays neu an

Gibt es eine Möglichkeit, die Reihenfolge der Spalten in einem numpy 2D-Array in eine neue und willkürliche Reihenfolge zu ändern? Zum Beispiel habe ich ein Array

array([[10, 20, 30, 40, 50],
       [ 6,  7,  8,  9, 10]])

und ich möchte es ändern, sagen wir

array([[10, 30, 50, 40, 20],
       [ 6,  8, 10,  9,  7]])

durch Anwenden der Permutation

0 -> 0
1 -> 4
2 -> 1
3 -> 3
4 -> 2

auf den Säulen. In der neuen Matrix möchte ich daher, dass die erste Spalte des Originals an Ort und Stelle bleibt, die zweite Spalte in die letzte Spalte wechselt und so weiter.

Gibt es dafür eine Numpy-Funktion? Ich habe eine ziemlich große Matrix und erwarte, dass sie noch größer wird. Deshalb brauche ich eine Lösung, die dies schnell und wenn möglich an Ort und Stelle erledigt (Permutationsmatrizen sind kein Problem).

Vielen Dank.

43
5xum

Dies ist mit ausgefallener Indizierung möglich:

>>> 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]])

Beachten Sie, dass dies eine Kopie und keine Ansicht ist. Eine In-Place-Permutation ist im Allgemeinen nicht möglich, da die Anzahl der Arrays im Speicher verteilt ist.

67
wim

Ich habe eine matrixbasierte Lösung dafür, indem ich eine Permutationsmatrix mit der ursprünglichen nachmultipliziere. Dies ändert die Position der Elemente in der ursprünglichen Matrix

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