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
は、それが自分だし。 dok
はdict
のサブクラスです。
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
に変換します。
マトリックス生成物は 'csr'(および' csc')フォーマットのために定義されています。他のフォーマットは最初に 'csr'に変換されるので、計算時間にその変換時間が含まれます。 – hpaulj