numpy の関数は行列einsumでは機能しないようです。スパース行列でできるようなことscipy.sparseを行う代替手段はありますか?einsum
@eickenberg の回答に応えて: 私が望んでいる特定の einsumnumpy.einsum("ki,kj->ij",A,A)は、行の外積の合計です。
numpy の関数は行列einsumでは機能しないようです。スパース行列でできるようなことscipy.sparseを行う代替手段はありますか?einsum
@eickenberg の回答に応えて: 私が望んでいる特定の einsumnumpy.einsum("ki,kj->ij",A,A)は、行の外積の合計です。
einsumの C バージョンを使用して、インデックス文字列を計算に変換しますnp.nditer。 http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html は の優れた紹介ですnditer。Cython特に最後の例に注意してください。
https://github.com/hpaulj/numpy-einsum/blob/master/einsum_py.pyは、.py の Python シミュレーションですeinsum。
scipy.sparse基本的な演算、合計、行列の乗算などを実行するための独自のコード (最終的には C) があります。スパース行列には独自のデータ構造があります。それらは、リスト、辞書、または numpy 配列のセットにすることができます。sparse適切な__xxx__メソッドがあるため、Numpy 表記を使用できます。
疎行列はmatrix、2 次元配列オブジェクトです。スパースeinsumを書くこともできますが、最終的には ではなく、スパース行列の乗算を使用することになりnditerます。したがって、せいぜい表記上の利便性です。
スパースcsr_matrix.dotは次のとおりです。
def dot(self, other):
"""Ordinary dot product
...
"""
return self * other
A=sparse.csr_matrix([[1,2],[3,4]])
A.dot(A.T).A
(A*A.T).A
A.__rmul__(A.T).A
A.__mul__(A.T).A
np.einsum('ij,kj',A.A,A.A)
# array([[ 5, 11],
# [11, 25]])