我使用Scipy Reverse Cuthill-McKee实现(scipy.sparse.csgraph.reverse_cuthill_mckee)来使用(高维)稀疏csr_matrix创建带矩阵 . 这个方法的结果是一个置换数组,它给出了如我所知的如何置换矩阵行的索引 .
现在有没有有效的解决方案在我的稀疏csr_matrix中对任何其他稀疏矩阵(csr,lil_matrix等)进行这种排列?我尝试了一个for循环,但我的矩阵的尺寸为200,000 x 150,000,这需要花费太多时间 .
A = csr_matrix((data,(rowind,columnind)), shape=(200000, 150000), dtype=np.uint8)
permutation_array = csgraph.reverse_cuthill_mckee(A, false)
result_matrix = lil_matrix((200000, 150000), dtype=np.uint8)
i=0
for x in np.nditer(permutation_array):
result_matrix[x, :]=A[i, :]
i+=1
reverse_cuthill_mckee调用的结果是一个数组,就像包含我的排列索引的tupel一样 . 所以这个数组是这样的:[199999 54877 54873 ...,12045 9191 0](size = 200,000)
这意味着:索引为0的行现在索引为199999,索引为1的行现在索引为54877,索引为2的行现在索引为54873等,请参阅:https://en.wikipedia.org/wiki/Permutation#Definition_and_notations(据我所知返回)
谢谢
1 回答
我想知道你是否正确应用了排列数组 .
创建一个随机矩阵(float)并将其转换为
uint8
(注意,csr
计算可能不适用于此dtype):(哎呀,这里使用了错误的矩阵):
我的第一个倾向是使用这样的数组来简单地索引原始矩阵的行:
我看到了一些聚类;也许是我们从随机矩阵中可以期待的最好的 .
另一方面,你似乎在做:
在
res
中,我没有看到1s聚类的任何改进 .相当于MATLAB的文档说
在
numpy
条款中,这意味着:事实上,在2个对角线角落中有更多的0个波段 .
并使用MATLAB页面上的带宽计算,https://www.mathworks.com/help/matlab/ref/symrcm.html
MATLAB文档说,通过这种排列,特征值保持不变 . 测试:
我们之前尝试过的行排列的特征值不相同:
[I,J]
置换与http://ciprian-zavoianu.blogspot.com/2009/01/project-bandwidth-reduction.html中的示例矩阵一起使用