【问题标题】:MemoryError with large sparse matrices具有大型稀疏矩阵的 MemoryError
【发布时间】:2014-11-30 18:11:22
【问题描述】:

对于一个项目,我构建了一个构建大型矩阵的程序。

def ExpandSparse(LNew):
SpId = ssp.csr_matrix(np.identity(MS))
Sz = MS**LNew
HNew = ssp.csr_matrix((Sz,Sz))
Bulk = dict()
for i in range(LNew-1):
    for j in range(LNew-1):
        if i == j:
            Bulk[(i,j)]=H2
        else:
            Bulk[(i,j)]=SpId
Ha = ssp.csr_matrix((8,8))
try:
    for i in range(LNew-1):
        for j in range(LNew-2):
            if j < 1:
                Ha = ssp.csr_matrix(ssp.kron(Bulk[(i,j)],Bulk[(i,j+1)]))
            else:
                Ha = ssp.csr_matrix(ssp.kron(Ha,Bulk[(i,j+1)]))
        HNew = HNew + Ha
except MemoryError:
    print('The matrix you tried to build requires too much memory space.')
    return
return HNew

这可以完成工作,但效果不如我预期的那样好。问题是它不允许非常大的矩阵。当LNew 大于 13 时,我会收到 MemoryError。我对 numpy 的经验表明,在我收到此错误之前,我应该能够将 LNew 提高到 18 或 19。这是否与我的代码有关,或者与 scipy.sparse.kron() 处理这些矩阵的方式有关?

另一个可能很重要的注意事项是我使用的是 Windows 而不是 Linux。

【问题讨论】:

  • 您能否提供一个独立的示例,其中定义了所有变量?比如MS的值是多少?
  • MS 在这种情况下是 2。H2 是一个 4 x 4 矩阵,定义为:H2 = ssp.csr_matrix(np.array([[0.25,0.0,0.0,0.0],[0.0,-0.25,0.5,0.0],[0.0,0.5,-0.25,0.0],[0.0,0.0,0.0,0.25]])) 其中 ssp 是 scipy.sparse
  • 你可以构造的最大Ha的大小是多少?我在考虑形状,更重要的是非零的数量。粗略地说,具有N 非零项的稀疏矩阵会将数据存储在 3 个数组 (N,) long 中(其中 2 个是 int dtype)。
  • 我能构造的最大Ha是8192 x 8192,其中存储了55496个CSR格式的元素。所以正如我提到的,奇怪的是,使用 numpy 我可以计算一个 4096 x 4096 的密集矩阵,但在这里我不能超过一个包含 55496 个非零元素的稀疏矩阵。

标签: python numpy scipy


【解决方案1】:

在阅读了scipy.sparse.kron() 函数的工作原理后,我注意到您可以输入第三个名为格式的术语。默认设置是无,但是当它设置为 'csr' 或其他支持的格式时,它只会使用稀疏格式,从而提高效率,现在对我来说,它可以构建一个 2097152 x 2097152 矩阵。这里LNew 是 21。

【讨论】:

    猜你喜欢
    • 2019-09-06
    • 2019-06-28
    • 2021-09-22
    • 2015-03-01
    • 2013-06-09
    • 1970-01-01
    • 2018-01-06
    • 2014-09-30
    • 2014-07-14
    相关资源
    最近更新 更多