学習したことはアウトプットしないとだめだということで
記事にしてみます
アインシュタインの縮約記法
物理学をやった人には馴染みがあるようですが
私は疎遠だったので実際にはやってみます
単体演算
a = np.arange(9).reshape(3,3)
array(
[[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
display(np.einsum("ii",a))
対角部分を足しあわせる
12
display(np.einsum("ii->i",a))
対角成分を残す
array([0, 4, 8])
display(np.einsum("ij->i",a))
i方向(行)に足しあわせる
array([ 3, 12, 21])
display(np.einsum("ij->j",a))``
j方向(列)に足しあわせる
array([ 9, 12, 15])
display(np.einsum("ij->ji",a))
display(a.T)
転置
array([[0, 3, 6],
[1, 4, 7],
[2, 5, 8]])
ベクトル演算
c = np.arange(4).reshape(2,2)
d = np.arange(6).reshape(2,3)
display(c,d)
c = array([
[0, 1],
[2, 3]])
d=array([
[0, 1, 2],
[3, 4, 5]])
np.einsum("ij,jk->ik",c,d)
c@dと同じ
array([
[ 3, 4, 5],
[ 9, 14, 19]])
np.einsum("ij,jk->ki",c,d)
(c@d).Tと同じ
array([
[ 3, 9],
[ 4, 14],
[ 5, 19]])
np.einsum("ij,ij->ij",a,a)
アダマール積(同じ場所の要素積)
array([
[ 0, 1, 4],
[ 9, 16, 25],
[36, 49, 64]])
参考