使用基于行或列的scipy.sparse
格式:csc_matrix
和csr_matrix
。
这些使用高效的C语言实现(包括乘法),并且移位是无操作的(特别是如果您调用transpose(copy=False)
),就像numpy数组一样。
编辑:通过ipython一些计时:
import numpy, scipy.sparse
n = 100000
x = (numpy.random.rand(n) * 2).astype(int).astype(float) # 50% sparse vector
x_csr = scipy.sparse.csr_matrix(x)
x_dok = scipy.sparse.dok_matrix(x.reshape(x_csr.shape))
现在x_csr
和x_dok
50%疏:
print repr(x_csr)
<1x100000 sparse matrix of type '<type 'numpy.float64'>'
with 49757 stored elements in Compressed Sparse Row format>
而且时机:
timeit numpy.dot(x, x)
10000 loops, best of 3: 123 us per loop
timeit x_dok * x_dok.T
1 loops, best of 3: 1.73 s per loop
timeit x_csr.multiply(x_csr).sum()
1000 loops, best of 3: 1.64 ms per loop
timeit x_csr * x_csr.T
100 loops, best of 3: 3.62 ms per loop
所以它看起来像我说谎。转置是非常便宜,但没有有效的C实现csr * csc(在最新的scipy 0.9.0中)。新的CSR对象在:-(
每个呼叫作为一个黑客构建的(尽管SciPy的相对稳定,这些天),您可以在稀疏的数据直接做点积:
timeit numpy.dot(x_csr.data, x_csr.data)
10000 loops, best of 3: 62.9 us per loop
注意这最后一种方法再次进行了一次numpy密集乘法运算,其稀疏性为50%,所以它实际上比dot(x, x)
快了2倍。
请参见下面的注释,但我最终只是滚动了我自己的稀疏矢量实现,一个“dok”矩阵 – spitzanator 2010-03-30 18:55:41
原始问题链接似乎已经死亡。@spitzanator。 – Mark 2016-07-26 13:14:06