在稀疏矩阵上执行外积的总和

Rus*_*llM 6 python numpy matrix scipy sparse-matrix

我正在尝试使用scipy的稀疏包来实现以下等式:

W = x[:,1] * y[:,1].T + x[:,2] * y[:,2].T + ...
Run Code Online (Sandbox Code Playgroud)

其中x和y是nxm csc_matrix.基本上我试图将x的每个col乘以y的每个col并将得到的nxn矩阵求和.然后我想制作所有非零元素1.

这是我目前的实施:

    c = sparse.csc_matrix((n, n))
    for i in xrange(0,m):
        tmp = bam.id2sym_thal[:,i] * bam.id2sym_cort[:,i].T
        minimum(tmp.data,ones_like(tmp.data),tmp.data)
        maximum(tmp.data,ones_like(tmp.data),tmp.data)

        c = c + tmp
Run Code Online (Sandbox Code Playgroud)

此实现具有以下问题:

  1. 内存使用似乎爆炸了.根据我的理解,内存应该只会随着c变稀疏而增加,但我看到循环开始吞噬> 20GB的内存,其中= 10,000,m = 100,000(x和y的每一行只有大约60个非零元素).

  2. 我正在使用一个效率不高的python循环.

我的问题:有更好的方法吗?控制内存使用量是我首先关注的问题,但要让它更快更好!

谢谢!

Ste*_*joa 3

请注意,以您描述的方式求出的外积之和与将两个矩阵相乘相同。换句话说,

sum_i X[:,i]*Y[:,i].T == X*Y.T
Run Code Online (Sandbox Code Playgroud)

所以只需将矩阵相乘即可​​。

Z = X*Y.T
Run Code Online (Sandbox Code Playgroud)

对于 n=10000 和 m=100000 并且每列在 X 和 Y 中都有一个非零元素,它几乎可以立即在我的笔记本电脑上进行计算。