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

问题描述

以下代码表明两个 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)。 AB 的 (1,2) 和 (9,13) 更容易阅读。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...