2017-02-17 8 views
1
私はnumpyののうち、最大のパフォーマンスを取得しようとしているし、それ例えば にゼロをたくさん持って配列してドット積を計算するためのより良い方法があった場合には思っていた

numpyのゼロ

a = np.array([[0, 3, 0], [1, 0, 1]]) 
print a.dot([1, 2, 5]) 

これは小さな例ですが、配列のどの場所にも80%のゼロを付け加えることができたはるかに大きなスケールの配列があった場合、私の質問は、ドットプロダクトを計算する際に、非常に多くのゼロがありますか?私は、指定されたスパースランダムスパース行列を定義

+0

にジャンプ。 – Akavall

+1

スパース行列を作成して使用する 'scipy.sparse'パッケージがあります。しかし、私の経験では、 'numpy' 'ドット"(すなわち、99%のゼロ)よりも速度優位性を得るために、マトリックスは1%以下のスパース性を持たなければなりません。 – hpaulj

+0

私は疎な行列を調べますが、それはいつもそれを使用することを推奨しますか?99%より高い@hpaulj – Glacier11

答えて

1
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%レベルの希少性では、2つのアプローチは同じ時間になります(スパースとの変換はありません)。このランダム行列について

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 
+0

@は私のためには機能しませんでしたが、代わりに私はMA.dot(MA.T)を使用しました – Glacier11

+0

私はちょうど新しいpython/numpyで怠け者でした。このような2次元配列の場合、結果は同じでなければなりません。 – hpaulj

関連する問題