Python SciPy:稀疏CSR矩阵的对称置换

Python SciPy:稀疏CSR矩阵的对称置换,python,matlab,scipy,octave,linear-algebra,Python,Matlab,Scipy,Octave,Linear Algebra,我想对称排列稀疏矩阵,用同样的方式排列行和列。例如,我想旋转行和列,这需要: 1 2 3 0 1 0 0 0 1 到 在倍频程或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 py

我想对称排列稀疏矩阵,用同样的方式排列行和列。例如,我想旋转行和列,这需要:

 1     2     3
 0     1     0
 0     0     1

在倍频程或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
有没有更干净的方法来完成矩阵的这种对称排列

我对简洁的语法比对MATLAB中的性能更感兴趣

A(perm,perm)
这是一个阻塞操作。在numpy中,[perm,perm]选择对角线上的元素

A[perm[:,None], perm]
是块索引。MATLAB对角线需要类似sub2ind的内容。一种语言简洁,而另一种语言则更为冗长

事实上,numpy在这两种情况下使用相同的逻辑。它“广播”一个索引与另一个索引,在对角线情况下是n对n,在块情况下是n,1对1,n。结果是n,n,n形的

这个numpy索引也适用于稀疏矩阵,尽管它没有那么快。它实际上使用矩阵乘法来做这种索引——使用一个基于索引的“提取器”矩阵,可能是2,M*A*M.T

关于置换矩阵的MATLAB文档:

在MATLAB中

A(perm,perm)
这是一个阻塞操作。在numpy中,[perm,perm]选择对角线上的元素

A[perm[:,None], perm]
是块索引。MATLAB对角线需要类似sub2ind的内容。一种语言简洁,而另一种语言则更为冗长

事实上,numpy在这两种情况下使用相同的逻辑。它“广播”一个索引与另一个索引,在对角线情况下是n对n,在块情况下是n,1对1,n。结果是n,n,n形的

这个numpy索引也适用于稀疏矩阵,尽管它没有那么快。它实际上使用矩阵乘法来做这种索引——使用一个基于索引的“提取器”矩阵,可能是2,M*A*M.T

关于置换矩阵的MATLAB文档: