正常に実行された場合、マトリックスが実際にはまばらである場合、スパースドットが高速になります。しかし、配列をcsr_matrix.dot
関数に投げることはできません。
In [68]: N=1000
In [69]: from scipy import sparse
In [70]: A=np.eye(N) # the diagonal is more interesting than all zeros
In [71]: B=np.random.rand(N,N)
ベースケース - 密行列積
In [72]: timeit np.dot(B,A)
10 loops, best of 3: 98.8 ms per loop
この時間は、同じサイズのすべての配列(例えばdot(B,B)
は、dot(A,A)
)についても同様です。
両方からスパース行列を作成します。 As
はBs
が何を持っていない、ゼロの多くを有するが、それは、スパースフォーマット
In [73]: As=sparse.csr_matrix(A)
In [74]: Bs=sparse.csr_matrix(B)
注変換時間です。彼らは些細ではない
In [101]: timeit sparse.csr_matrix(A)
100 loops, best of 3: 13.8 ms per loop
In [102]: timeit sparse.csr_matrix(B)
10 loops, best of 3: 50.1 ms per loop
csr行列を持つ行列積は高速になる可能性があります。より明確になるので、Bs.dot(As)
フォームを使用します。 Bs*As
およびnp.dot(Bs,As)
は同等です。私たちは、変換時間が含まれている場合でも、np.dot(Bs,A)
In [107]: timeit Bs.dot(As)
100 loops, best of 3: 19 ms per loop
In [112]: timeit sparse.csr_matrix(B).dot(sparse.csr_matrix(A)).A
10 loops, best of 3: 94.1 ms per loop
注目すべき密集したバージョンよりも良いが、わずかに良くしようとしないでください。
しかし回広く行列
In [108]: timeit As.dot(Bs)
100 loops, best of 3: 10 ms per loop
In [109]: timeit As.dot(B)
100 loops, best of 3: 5.82 ms per loop
In [110]: timeit As.dot(As)
1000 loops, best of 3: 215 µs per loop
In [111]: timeit Bs.dot(Bs)
1 loop, best of 3: 3.83 s per loop
'%の時間csr_matrix(B).DOT(A)のスパース性に依存して変化することに注意' csr_matrix'に最初の 'B'の変換を行います。それはまたあなたが時間に欲しいものですか? – jotasi
しかし、Bは疎な行列ではありません。 csr_matrixはスパース行列にのみ適用する必要があります。 – NunodeSousa
私は行列が非常に大きく疎な場合にのみ、疎行列法でgoと言うでしょう。 'np.dot'は通常のシナリオでは非常に効率的です。 – Divakar