我正在尝试使用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
此实现存在以下问题:
内存使用似乎爆炸了。根据我的理解,内存应该只会随着c变得稀疏而增加,但我看到循环开始吃掉> 20GB的内存,其中= 10,000,m = 100,000(x& y的每一行只有大约60非零元素)。
我正在使用效率不高的python循环。
我的问题:有更好的方法吗?控制内存使用量是我首先要考虑的因素,但要让它更快,真是太棒了!
谢谢!
答案 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的使用: