稀疏CSR矩阵的对称置换

2024-09-28 13:43:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

 1     2     3
 0     1     0
 0     0     1

^{pr2}$

在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

有没有更干净的方法来完成矩阵的这种对称排列?在

(我对简洁的语法比对性能更感兴趣)


Tags: importdatanp方式矩阵colarraymatrix
1条回答
网友
1楼 · 发布于 2024-09-28 13:43:01

在MATLAB中

A(perm,perm)

是块操作。InnumpyA[perm,perm]选择对角线上的元素。在

^{pr2}$

是块索引。MATLAB对角线需要类似sub2ind的内容。一种语言简洁的语言在另一种语言中更为冗长

实际上,numpy在这两种情况下都使用相同的逻辑。它将一个索引“广播”到另一个索引,在对角情况下,(n,)针对{},而{}针对{}在块的情况下。结果是(n,)和{}形状。在

这种numpy索引也适用于稀疏矩阵,尽管速度不如它快。实际上,它使用矩阵乘法来完成这种索引-使用基于索引的“提取器”矩阵(可能是2,M*A*M.T)。在


MATLAB关于置换矩阵的文档:

https://www.mathworks.com/help/matlab/math/sparse-matrix-operations.html#f6-13070

相关问题 更多 >

    热门问题