使用基於行或列的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