【问题标题】:how do I interpret np.einsum("ijij->ij"我如何解释 np.einsum("ijij->ij"
【发布时间】:2020-05-25 23:49:17
【问题描述】:

我正在尝试理解 np.einsum,但似乎没有与我的特定上下文相关的示例。在numpy docsguide herehere 和 stackoverflow 答案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,如果有人能告诉我在给定的 padded_matrix 作为 <class 'numpy.ndarray'> 的上下文中“ijij->ij”应该做什么,我将不胜感激。

我最好的猜测是

np.einsum("ii->i,A") 查看矩阵 A 的对角线,这是否意味着在此用法中,i 由于所有填充而被ij 有效替换,因此np.einsum("ijij->ij",padded_matrix) 是二甘醇的视图?

【问题讨论】:

  • 没有相乘,因为只有一个参数padded_matrix
  • @hpaulj 我刚刚将我的猜测添加到问题的底部,您是否同意看起来正在计算的是内部矩阵的对角线视图?

标签: python-3.x numpy array-broadcasting numpy-einsum


【解决方案1】:

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

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])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 2019-11-19
    • 1970-01-01
    • 2023-03-30
    • 2015-03-23
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多