完成正確,稀疏點更快 - 如果矩陣確實稀疏。但是你不能只把數組放入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)的稀疏性'第一確實'B'的轉化到一個'csr_matrix'。這是你想要的時間嗎? – jotasi
但B不是稀疏矩陣。 csr_matrix應該只應用於稀疏矩陣。 – NunodeSousa
我會說,只有當矩陣非常大且稀疏時,才使用稀疏矩陣方法。 'np.dot'在正常情況下非常有效。 – Divakar