6

numpy の関数は行列einsumでは機能しないようです。スパース行列でできるようなことscipy.sparseを行う代替手段はありますか?einsum

@eickenberg の回答に応えて: 私が望んでいる特定の einsumnumpy.einsum("ki,kj->ij",A,A)は、行の外積の合計です。

4

2 に答える 2

3

einsumの C バージョンを使用して、インデックス文字列を計算に変換しますnp.nditerhttp://docs.scipy.org/doc/numpy/reference/arrays.nditer.html は の優れた紹介ですnditerCython特に最後の例に注意してください。

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]])
于 2014-04-27T16:43:41.540 に答える