我该如何解释 np.einsum("ijij->ij"

how do I interpret np.einsum("ijij->ij"

我正在尝试理解 np.einsum,但似乎没有与我的特定上下文相关的示例。 numpy docs, a guide here, here, and a Whosebug answer here中有很多很好的例子。

但是

没有与我的问题相似的例子np.einsum("ijij->ij", padded_matrix)

当我输出 padded_matrix 时,我得到

     >> padded_matrix  

>> [[[[[1.         0.         0.         0.33333333 0.         0.33333333]]

   [[0.         1.         0.         0.         0.         0.        ]]

   [[0.         0.         1.         0.         0.         0.        ]]

   [[0.33333333 0.         0.         1.         0.         0.33333333]]

   [[0.         0.         0.         0.         1.         0.        ]]

   [[0.33333333 0.         0.         0.33333333 0.         1.        ]]]]]

padded_matrix为1的长度,为<class 'numpy.ndarray'>。不幸的是,复制填充矩阵的输出不起作用。在实际程序中,padded_matrix 是对函数的调用,太复杂而无法包含在这里,因此,为什么我复制了它的输出。

结果是 [[1. 1. 1. 1. 1. 1.]] 但我无法弄清楚元素是如何相乘的,然后在哪个轴上求和。

鉴于我没有提供有效的 MWE,如果有人能告诉我 "ijij->ij" 在给定的 padded_matrix 作为 <class 'numpy.ndarray'> 的上下文中应该做什么,我会不胜感激

我最好的猜测是

np.einsum("ii->i,A") 查看矩阵 A 的对角线,这是否意味着在这种用法中,由于所有填充,i 被有效地替换为 ij,因此 np.einsum("ijij->ij",padded_matrix)是diaganol的观点吗?

没有乘法,因为只有一个参数:

In [25]: arr = np.arange(36).reshape(1,6,1,6)                                            
In [26]: arr                                                                             
Out[26]: 
array([[[[ 0,  1,  2,  3,  4,  5]],

        [[ 6,  7,  8,  9, 10, 11]],

        [[12, 13, 14, 15, 16, 17]],

        [[18, 19, 20, 21, 22, 23]],

        [[24, 25, 26, 27, 28, 29]],

        [[30, 31, 32, 33, 34, 35]]]])
In [27]: np.einsum('ijij->ij', arr)                                                      
Out[27]: array([[ 0,  7, 14, 21, 28, 35]])

这个einsum实际上是一个diagonal

In [29]: np.einsum('ii->i', arr.squeeze())                                               
Out[29]: array([ 0,  7, 14, 21, 28, 35])
In [30]: np.diagonal(arr.squeeze())                                                      
Out[30]: array([ 0,  7, 14, 21, 28, 35])