Scipy稀疏矩阵元素明智的乘法

时间:2015-01-28 08:45:06

标签: python scipy matrix-multiplication sparse-matrix

我正在尝试对两个大型稀疏矩阵进行逐元素乘法。两者的大小都在(400K X 500K)左右,大约有100M元素。

但是,它们在相同位置可能没有非零元素,并且它们可能没有相同数量的非零元素。在任何一种情况下,我都可以将一个矩阵的非零值与另一个矩阵中的零值相乘为零。

我在每种方法中都会耗尽内存(8GB),这没有多大意义。我不应该。这些都是我尝试过的。

A和B是稀疏矩阵(我尝试过使用COO和CSC格式)。

# I have loaded sparse matrices A and B, and have a file opened in write mode
row,col = A.nonzero()
index = zip(row,col)
del row,col
for i,j in index :
    # Approach 1
    A[i,j] *= B[i,j]

    # Approach 2
    someopenfile.write(' '.join([str(i),str(j),str(A[j,j]*B[i,j]),'\n']))

    # Approach 3
    if B[i,j] != 0 :
        A[i,j] = A[i,j]*B[i,j] # or, I wrote it to a file instead 
                               # like in approach 2

如果我注释掉for循环,我看到我使用了近3.5GB的内存。但是,当我使用循环时,无论是将产品写入文件还是返回矩阵,内存使用量都会达到完整内存,导致我停止执行,或者系统挂起。如何在不消耗大量内存的情况下进行此操作?

1 个答案:

答案 0 :(得分:4)

我怀疑当您尝试执行操作时,稀疏矩阵变得非稀疏:

A.multiply(B)

我怀疑它会比你可以轻松做的任何事情都更好地进行优化。

如果A不是您可能需要的正确类型的稀疏矩阵:

A = A.tocsr()
# May also need 
# B = B.tocsr()
A = A.multiply(B)