我已将Cuthill-McKee算法的SciPy实现稀疏非对称矩阵,输出是长度为的数组,文档称之为“排列数组” .
如何使用这个“排列”数组?
显然,该数组以某种方式表示我的矩阵将如何重新排序,但长度为的排列数组仅足以重新排序一个轴。我错过了什么?
我已将Cuthill-McKee算法的SciPy实现稀疏非对称矩阵,输出是长度为的数组,文档称之为“排列数组” .
如何使用这个“排列”数组?
显然,该数组以某种方式表示我的矩阵将如何重新排序,但长度为的排列数组仅足以重新排序一个轴。我错过了什么?
反向 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])