Я хотел бы симметрично переставить разреженную матрицу, переставляя строки и столбцы таким же образом. Например, я хотел бы повернуть строки и столбцы, что занимает:
1 2 3
0 1 0
0 0 1
до
1 0 0
0 1 0
2 3 1
В Octave или MATLAB это можно сделать кратко с помощью матричной индексации:
A = sparse([1 2 3; 0 1 0; 0 0 1]);
perm = [2 3 1];
Aperm = A(perm,perm);
Я заинтересован в том, чтобы сделать это на Python с NumPy / SciPy. Вот попытка:
#!/usr/bin/env python
import numpy as np
from scipy.sparse import csr_matrix
row = np.array([0, 0, 0, 1, 2])
col = np.array([0, 1, 2, 1, 2])
data = np.array([1, 2, 3, 1, 1])
A = csr_matrix((data, (row, col)), shape=(3, 3))
p = np.array([1, 2, 0])
#Aperm = A[p,p] # gives [1,1,1], the permuted diagonal
Aperm = A[:,p][p,:] # works, but more verbose
Есть ли более чистый способ для выполнения такого рода симметричной перестановки матрицы?
(меня больше интересует краткий синтаксис, чем производительность)