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]])