我試圖獲得最大表現出來numpy的和不知道是否有更好的方法來計算點積有,有很多零的它 例如數組:numpy的零
a = np.array([[0, 3, 0], [1, 0, 1]])
print a.dot([1, 2, 5])
這是一個小例子,但如果我們有一個更大的數組,在數組中的任何位置可以說80%的零,我的問題是有沒有更好或更快的計算點積的方法有這麼多的零?
我試圖獲得最大表現出來numpy的和不知道是否有更好的方法來計算點積有,有很多零的它 例如數組:numpy的零
a = np.array([[0, 3, 0], [1, 0, 1]])
print a.dot([1, 2, 5])
這是一個小例子,但如果我們有一個更大的數組,在數組中的任何位置可以說80%的零,我的問題是有沒有更好或更快的計算點積的方法有這麼多的零?
In [269]: from scipy import sparse
In [270]: M=sparse.random(1000,1000,.1, 'csr')
In [271]: MA = M.A
In [272]: timeit M*M.T
10 loops, best of 3: 64 ms per loop
In [273]: timeit [email protected]
10 loops, best of 3: 60.4 ms per loop
我所定義的隨機稀疏矩陣與一個指定稀疏性,10%:
In [274]: M
Out[274]:
<1000x1000 sparse matrix of type '<class 'numpy.float64'>'
with 100000 stored elements in Compressed Sparse Row format>
In [275]: np.allclose([email protected], (M*M.T).A)
Out[275]: True
@
是dot
操作形式(見np.matmul
)。因此,在這個稀疏度爲10%的水平上,兩種方法的時間相同(沒有任何稀疏轉換)。
對於這種隨機矩陣,所述M*M.T
結果是緻密:
In [282]: (M*M.T)
Out[282]:
<1000x1000 sparse matrix of type '<class 'numpy.float64'>'
with 999964 stored elements in Compressed Sparse Row format>
稀疏倍很大程度上取決於稀疏;茂密的時間並不
In [295]: M=sparse.random(1000,1000,.01, 'csr'); MA=M.A
In [296]: timeit M*M.T
100 loops, best of 3: 2.44 ms per loop
In [297]: timeit [email protected]
10 loops, best of 3: 56.3 ms per loop
In [298]: M=sparse.random(1000,1000,.2, 'csr'); MA=M.A
In [299]: timeit M*M.T
10 loops, best of 3: 175 ms per loop
In [300]: timeit [email protected]
10 loops, best of 3: 56.3 ms per loop
隨着往返於稀疏和背部,時間跳到60至100毫秒
In [302]: %%timeit
...: M1=sparse.csr_matrix(MA)
...: (M1*M1.T).A
...:
10 loops, best of 3: 104 ms per loop
也許使用稀疏矩陣會更快。 – Akavall
有一個'scipy.sparse'包創建和使用稀疏矩陣。但根據我的經驗,矩陣必須具有低於1%的稀疏性才能獲得超過numpy「點」(即99%零)的速度優勢。 – hpaulj
我會研究稀疏矩陣,但是你會推薦一直使用它,或者只是當它高於99%@hpaulj – Glacier11