【问题标题】:operation of Einstein sum of 3D matrices爱因斯坦 3D 矩阵和的运算
【发布时间】:2021-01-16 18:07:03
【问题描述】:

以下代码表示两个 3D (2x2x2) 矩阵的 Einstein 和是一个 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]]]])

有人能解释一下手术是如何进行的吗?

【问题讨论】:

    标签: numpy numpy-einsum


    【解决方案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])
    

    如果我们将两个数组都重新整形为 2d 可能会更容易理解:

    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) 更容易阅读。

    【讨论】:

    • 感谢您的插图。忘记了深度是第一维,而不是第三维。顺便说一句,我认为使用 c0000=np.dot(a[0,0,:], b[:,0,0]) 会更简单。
    猜你喜欢
    • 2011-05-24
    • 1970-01-01
    • 2016-12-20
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    相关资源
    最近更新 更多