python - que - Reorganizar columnas de matriz 2D numpy
que es numpy (2)
¿Hay alguna manera de cambiar el orden de las columnas en una matriz 2D numpy a un orden nuevo y arbitrario? Por ejemplo, tengo una matriz
array([[10, 20, 30, 40, 50],
[ 6, 7, 8, 9, 10]])
y quiero cambiarlo en, digamos
array([[10, 30, 50, 40, 20],
[ 6, 8, 10, 9, 7]])
aplicando la permutación
0 -> 0
1 -> 4
2 -> 1
3 -> 3
4 -> 2
en las columnas. En la nueva matriz, por lo tanto, quiero que la primera columna del original permanezca en su lugar, la segunda para moverse a la última columna y así sucesivamente.
¿Hay una función numpy para hacerlo? Tengo una matriz bastante grande y espero obtener las más grandes, así que necesito una solución que haga esto rápidamente y en su lugar si es posible (las matrices de permutación son un no-go)
Gracias.
Esto es posible mediante la indexación de fantasía:
>>> 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]])
Tenga en cuenta que esto es una copia, no una vista. Una permutación in situ no es posible en el caso general, debido a la forma en que se ordenan las matrices numpy en la memoria.
Tengo una solución basada en matriz para esto, por la multiplicación posterior de una matriz de permutación a la original. Esto cambia la posición de los elementos en la matriz original.
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)