爱因斯坦 3D 矩阵和的运算

时间:2021-01-16 18:07:03

标签: numpy numpy-einsum

以下代码表明两个 3D (2x2x2) 矩阵的爱因斯坦和是一个 4D (2x2x2x2) 矩阵。

$ c_{ijlm} = \Sigma_k a_{i,j,k}b_{k,l,m} $

$ c_{0,0,0,0} = \Sigma_k a_{0,0,k}b_{k,0,0} = 1x9 + 5x11 = 64 $ 

但是,根据以下结果,c_{0,0,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]]]])

有人可以解释一下操作是如何进行的吗?

1 个答案:

答案 0 :(得分:1)

您正在测试的特定元素 [0,0,0,0] 的计算公式为:

In [167]: a[0,0,:]*b[:,0,0]
Out[167]: array([ 9, 26])
In [168]: a[0,0,:]
Out[168]: array([1, 2])
In [169]: b[:,0,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,2)。 AB 的 (1,2) 和 (9,13) 更容易阅读。