Матрицы перестановок - хорошая математическая концепция, но они не подходят для программного переупорядочения элементов в векторе (если только вы не пытаетесь сделать что-то особенное с numpy).
Создание матрицы перестановок (P) из вектора (K) переупорядоченных индексов можно сделать следующим образом:
def pMatBuild(A):
return [ [int(a==b) for b in range(len(A))] for a in A ]
K = [0,3,1,4,2]
P = pMatBuild(K)
output:
for line in P: print(line)
[1, 0, 0, 0, 0]
[0, 0, 0, 1, 0]
[0, 1, 0, 0, 0]
[0, 0, 0, 0, 1]
[0, 0, 1, 0, 0]
Применение этой матрицы перестановок к другому вектору (т.е. умножению) банок сделать это так:
def pMatApply(P,V):
return [ V[row.index(1)] for row in P ] # inefficient lookup of 1 on each row
output:
V = "ABCDE"
print(pMatApply(P,V))
['A', 'D', 'B', 'E', 'C']
Но в коде гораздо эффективнее матрицы перестановок будет использовать исходный индексный вектор K :
V = "ABCDE"
print([V[i] for i in K])
['A', 'D', 'B', 'E', 'C']