Переупорядочить столбцы двумерного массива numpy
Есть ли способ изменить порядок столбцов в двумерном массиве numpy на новый и произвольный порядок?
Например, у меня есть массив
array([[10, 20, 30, 40, 50],
[ 6, 7, 8, 9, 10]])
и я хочу изменить его, скажем
array([[10, 30, 50, 40, 20],
[ 6, 8, 10, 9, 7]])
применяя перестановку
0 -> 0
1 -> 4
2 -> 1
3 -> 3
4 -> 2
в столбцах. Поэтому в новой матрице я хочу, чтобы первый столбец оригинала оставался на месте, второй - для перехода к последнему столбцу и т.д.
Есть ли функция numpy для этого? Я имею довольно большую матрицу и ожидаю получить еще большие, поэтому мне нужно решение, которое делает это быстро и на месте, если это возможно (матрицы перестановок - нет-go)
Спасибо.
Ответы
Ответ 1
Это возможно с помощью удобной индексации:
>>> 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]])
Обратите внимание, что это копия, а не вид. Перестановка на месте невозможна в общем случае из-за того, как массивы numpy массируются в памяти.
Ответ 2
У меня есть матричное решение для этого, после умножения матрицы перестановок на исходную. Это изменяет положение элементов в исходной матрице
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)