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文档: