Подтвердить что ты не робот

Переупорядочить столбцы двумерного массива 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)

Спасибо.

4b9b3361

Ответ 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)