2016-11-02 7 views
1

私は疎行列と密ベクトルの内積のための時間が増加している理由を理解したい:csrが最速で、その後csccoolildok(最も遅いです)。言い換えれば、私はdiferrent fmtのために、このプログラムの開発の時間を測定:ドット複雑

A = scipy.sparse.random(1000, 1000, format=fmt) 
b = np.random.randn(1000, 1) 
res = %timeit -o A * b 

私はドットの機能のためにscipyのダウンロードのソースコードを見つけたいです。 csrcoocsccsr_matveccoo_matvec、csc_matvecは10のreputaion =がある場合は3番目のリンクにする必要があります)。しかし、私はlildokのような機能を見つけることができません。どのように私はそれを見つけることができる誰か答えてもらえますか? lil形式の

+0

マトリックス生成物は 'csr'(および' csc')フォーマットのために定義されています。他のフォーマットは最初に 'csr'に変換されるので、計算時間にその変換時間が含まれます。 – hpaulj

答えて

3
In [298]: M=sparse.coo_matrix(np.eye(3)) 

製品は最初csrに変換することによって実行されます。

In [299]: Ml=M.tolil() 
In [300]: Ml._mul_vector?? 
Signature: Ml._mul_vector(other) 
Source: 
    def _mul_vector(self, other): 
     return self.tocsr()._mul_vector(other) 
File:  /usr/lib/python3/dist-packages/scipy/sparse/base.py 
Type:  method 

dokは、それが自分だし。 dokdictのサブクラスです。

In [303]: Md=M.todok() 
In [304]: Md._mul_vector?? 
Signature: Md._mul_vector(other) 
Source: 
    def _mul_vector(self, other): 
     # matrix * vector 
     result = np.zeros(self.shape[0], dtype=upcast(self.dtype,other.dtype)) 
     for (i,j),v in iteritems(self): 
      result[i] += v * other[j] 
     return result 
File:  /usr/lib/python3/dist-packages/scipy/sparse/dok.py 

しかし、別のスパース行列との乗算では、csrの変換を行います。

In [305]: Md._mul_sparse_matrix?? 
Signature: Md._mul_sparse_matrix(other) 
Source: 
    def _mul_sparse_matrix(self, other): 
     return self.tocsr()._mul_sparse_matrix(other) 
File:  /usr/lib/python3/dist-packages/scipy/sparse/base.py 

この最後のコードはbase.pyです。これは一般的なスパースコードが存在する場所です。フォーマットが独自のメソッドを定義していない場合は、ベースバージョンを使用します。

In [306]: Md.__class__.__mro__ 
Out[306]: 
(scipy.sparse.dok.dok_matrix, 
scipy.sparse.base.spmatrix, 
scipy.sparse.sputils.IndexMixin, 
dict, 
object) 

cooはまた、完全な行列積のためcsrに変換します。