私は1次元スパース行列乗法対numpy配列をテストするために以下のケースを構築しました。次のようにScipyスパース行列乗算がnumpy配列よりもはるかに遅い
from scipy.sparse import csc_matrix
sp = csc_matrix((1, 36710))
sp[0,4162] = 0.2335
sp[0,21274] = 0.1367
sp[0,27322] = 0.261
sp[0,27451] = 0.9266
%timeit sp.dot(sp.T)
arr = sp.toarray()[0]
%timeit arr.dot(arr)
結果は:
267 µs ± 6.58 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
9.9 µs ± 230 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
はまた、彼らは両方のエントリを格納する普通のdictよりも遅いとしているため、ループ乗算(〜1μsの)のために。
結果は、csr/cooを含む異なる種類の疎行列を試した後も同じです。なぜ、疎な行列の乗算が、numpyの密な配列の乗算よりも30倍遅いのですか?マトリックスはあまりにも希薄ですか?
さらに速く解決策があります: 'sp.data.dot(sp.data)'、 'loop' –
@NilsWernerあたり3.3nsが、私はおそらく必要がこの例を少し変更するには、異なる行列に乗法を適用する必要があります。その場合、解が間違った答えを返す –
疎ベクトルを使用することで得られる余裕があまりないと思います。スパース行列(nxm、n、m> 1)を使用すると、状況が実際に変わります。 – Hannebambel