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

时间:2011-08-04 18:20:26

标签: python matrix numpy scipy sparse-matrix

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

W = x[:,1] * y[:,1].T + x[:,2] * y[:,2].T + ...

其中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

此实现存在以下问题:

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

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

  3. 我的问题:有更好的方法吗?控制内存使用量是我首先要考虑的因素,但要让它更快,真是太棒了!

    谢谢!

2 个答案:

答案 0 :(得分:3)

请注意,您描述的方式的外部产品总和与将两个矩阵相乘的方式完全相同。换句话说,

sum_i X[:,i]*Y[:,i].T == X*Y.T

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

Z = X*Y.T

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

答案 1 :(得分:0)

在内存和性能方面,这可能是使用Cython的主要候选者。

以下文章的一部分描述了它与稀疏scipy matricies的使用:

http://folk.uio.no/dagss/cython_cise.pdf