3

numpy.einsum() 関数を理解しようとしていますが、ドキュメントとスタックオーバーフローからのこの回答にはまだいくつかの質問があります。

答えで定義されたアインシュタイン和と行列を考えてみましょう。

A = np.array([0, 1, 2])

B = np.array([[ 0,  1,  2,  3],
                  [ 4,  5,  6,  7],
                  [ 8,  9, 10, 11]])

np.einsum('i,ij->i', A, B)

したがって、アインシュタインの合計の理解に基づいて、この関数を表記 (A_i*B_ij) と同等に変換すると、次のようになります。

j = 1 : A_1*B_11 + A_2*B_21 + A_3*B_31

j = 2 : A_1*B_12 + A_2*B_22+ A_3*B_32

j = 4 まで続きます。

j = 1 : 0 + 4 + 16

j = 2 : 0 + 5 + 18

私の理解によれば、これはアインシュタインの総和になります。代わりに、関数は全体の合計を実行しませんが、(A_i * B_ij) の結果を見つけることができるマトリックスに別の項を格納します。

0   0   0   0
4   5   6   7
16  18  20  22

これは関数によって実際にどのように制御されますか? ドキュメントに記載されているように、これは出力ラベルによって制御されていると思います:

出力添字ラベルを指定することでも、出力を制御できます。これはラベルの順序を指定し、必要に応じて合計を禁止または強制することができます

どういうわけか、置くと->i内部合計の合計が無効になると思います。しかし、これはどのように正確に機能しますか? これは私には明確ではありません。Putting->jは、期待どおりの実際のアインシュタインの合計を提供します。

4

1 に答える 1