【问题标题】:SciPy: Symmetric permutation of sparse CSR matrixSciPy:稀疏 CSR 矩阵的对称排列
【发布时间】:2019-08-09 06:37:19
【问题描述】:

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

 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

有没有更简洁的方法来完成这种矩阵的对称排列?

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

【问题讨论】:

    标签: python matlab scipy octave linear-algebra


    【解决方案1】:

    在 MATLAB 中

    A(perm,perm)
    

    是一个块操作。在numpy A[perm,perm] 中选择对角线上的元素。

    A[perm[:,None], perm]
    

    是块索引。 MATLAB 对角线需要 sub2ind 之类的东西。一个简洁的东西在另一个中更冗长,v.v.

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

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


    MATLAB 关于置换矩阵的文档:

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

    【讨论】:

      猜你喜欢
      • 2017-03-20
      • 2016-10-29
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      相关资源
      最近更新 更多