问题描述
以下代码表明两个 3D (2x2x2) 矩阵的爱因斯坦和是一个 4D (2x2x2x2) 矩阵。
$ c_{ijlm} = \Sigma_k a_{i,j,k}b_{k,l,m} $
$ c_{0,0} = \Sigma_k a_{0,0} = 1x9 + 5x11 = 64 $
但是,根据以下结果,c_{0,0} = 35:
>>> a=np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
>>> b=np.array([[[9,10],[11,12]],[[13,14],[15,16]]])
>>> c=np.einsum('ijk,klm->ijlm',a,b)
>>> c
array([[[[ 35,38],[ 41,44]],[[ 79,86],[ 93,100]]],[[[123,134],[145,156]],[[167,182],[197,212]]]])
有人可以解释一下操作是如何进行的吗?
解决方法
您正在测试的特定元素 [0,0] 的计算公式为:
In [167]: a[0,:]*b[:,0]
Out[167]: array([ 9,26])
In [168]: a[0,:]
Out[168]: array([1,2])
In [169]: b[:,0]
Out[169]: array([ 9,13])
如果我们将两个数组都重新整形为二维可能更容易理解:
In [170]: A=a.reshape(-1,2); B=b.reshape(2,-1)
In [171]: A
Out[171]:
array([[1,2],[3,4],[5,6],[7,8]])
In [172]: B
Out[172]:
array([[ 9,10,11,12],[13,14,15,16]])
In [173]: A@B
Out[173]:
array([[ 35,38,41,44],[ 79,86,93,100],[123,134,145,156],[167,182,197,212]])
相同的数字,但在 (4,4) 而不是 (2,2,2)。 A
和 B
的 (1,2) 和 (9,13) 更容易阅读。