我有一个大的稀疏对称矩阵,我需要通过取块和来压缩它,从而得到一个新的更小的矩阵。在
例如,对于一个4x4稀疏矩阵a,我想制作一个2x2矩阵B,其中B[I,j]=和(a[I:I+2,j:j+2])。在
目前,我只是逐块重建压缩矩阵,但这很慢。关于如何优化这一点有什么想法吗?在
更新:下面是一个示例代码,它运行良好,但对于50.000x50.000的稀疏矩阵,我想将其压缩为10.000x10.000:
>>> A = (rand(4,4)<0.3)*rand(4,4)
>>> A = scipy.sparse.lil_matrix(A + A.T) # make the matrix symmetric
>>> B = scipy.sparse.lil_matrix((2,2))
>>> for i in range(B.shape[0]):
... for j in range(B.shape[0]):
... B[i,j] = A[i:i+2,j:j+2].sum()
对于4x4示例,可以执行以下操作:
使用类似于itertools的东西,应该可以自动化并通用
u
的表达式。在给定一个大小为N的正方形矩阵和一个拆分大小为d的矩阵(因此矩阵将被划分为N/d*N/d的子矩阵),你能用几次
numpy.split
来建立这些子矩阵的集合,并将它们相加,然后将它们放在一起吗?在这应该被视为伪代码而不是有效的实现,但它表达了我的想法:
或者更紧凑的
^{pr2}$这样可以得到如下结果:
首先,}(我不知道哪个更好,但是{}对于这些操作中的许多来说可能天生就比较慢,即使切片也可能慢得多,尽管我没有测试)。(除非您知道例如
lil
你总结的矩阵可能真的很糟糕,我会尝试COO
或者{dia
非常适合)基于}数组来给出确切的位置:
COO
我可以想象做一些欺骗。由于COO
有row
和{(我不能保证我没有混淆行和列,这只适用于方阵…)
相关问题 更多 >
编程相关推荐