在 SciPy 中应用 Cuthill-McKee 的结果

计算科学 算法 Python 稀疏矩阵 矩阵 scipy
2021-12-02 22:58:43

我已将Cuthill-McKee算法的SciPy实现稀疏对称矩阵,输出是长度为的数组,文档称之为“排列数组” .48×4848

如何使用这个“排列”数组?

显然,该数组以某种方式表示我的矩阵将如何重新排序,但长度为的排列数组仅足以重新排序一个轴。我错过了什么?48

2个回答

反向 Cuthill-McKee 算法产生适用于行和列的重新排序。这是因为它通过将矩阵视为(无向)连接节点的图来工作。根据 SciPy 中的函数文档,输出数组是排列后的行/列索引,因此您可以简单地执行以下操作

perm = reverse_cuthill_mckee(arr_orig)
arr_perm = arr_orig[perm, perm]

numpy 的花哨的索引功能会处理它。当然,这涉及复制您的数组,我认为这是可以接受的。

我不确定尼克的回答是否正确,或者它在以前的版本中是否有效,但在这个版本中并没有。

首先,reverse_cuthill_mckee不将 NumPy 数组作为输入,但它需要一个csr_matrix.

我认为应该是:

arr = [
    [0, 1 , 2, 0],
    [0, 0, 0, 1],
    [2, 0, 0, 3],
    [0, 0, 0, 0]
    ]
    
graph = csr_matrix(arr)
perm = reverse_cuthill_mckee(graph)
reord_arr = csr_matrix.toarray(graph[perm])