【问题标题】:How to Broadcast Sum Vector and Tensor?如何广播和向量和张量?
【发布时间】:2020-08-03 02:13:11
【问题描述】:

假设我们有:

  • 行向量V,形状为(F,1),并且
  • 形状为(N, F, X, Y)的4-D张量T

作为一个具体的例子,让N, F, X, Y = 2, 3, 2, 2。让V = [v0, v1,v2].

然后,我想将 v0 逐元素添加到内部 2x2 矩阵 T[0,0]v1T[0,1]v2T[0,2]。同样,我想将v0添加到T[1,0],将v1添加到T[1,1],并将v2添加到T[1,2]

因此,在“最内层”级别,2x2 矩阵和标量之间的加法,例如T[0,0] + v0,使用广播来逐元素添加v0。然后我要做的是更普遍地将其应用于每个内部 2x2。

我尝试过使用np.einsum()np.tensordot(),但我无法从更基本的层面上弄清楚这些函数中的每一个实际上在做什么,所以我想要求更一步一步解释如何进行这种计算。

谢谢

【问题讨论】:

    标签: python numpy matrix-multiplication tensor array-broadcasting


    【解决方案1】:

    乘法:您可以简单地将您的文本翻译成eisnum 的索引名称,它会负责广播:

    TV = np.einsum('ijkl,j->ijkl',T,V)
    

    添加:只需使用None 将维度添加到您的V 以匹配T 的最后两个维度,然后广播将处理其余部分:

    TV = T + V[:,None,None]
    

    示例输入/输出,显示您的输出所需的添加行为:

    T:

    [[[[7 4]
       [5 9]]
    
      [[0 3]
       [2 6]]
    
      [[7 6]
       [1 1]]]
    
    
     [[[8 0]
       [8 7]]
    
      [[2 6]
       [9 2]]
    
      [[8 6]
       [4 9]]]]
    

    V:

    [0 1 2]
    

    电视:

    [[[[ 7  4]
       [ 5  9]]
    
      [[ 1  4]
       [ 3  7]]
    
      [[ 9  8]
       [ 3  3]]]
    
    
     [[[ 8  0]
       [ 8  7]]
    
      [[ 3  7]
       [10  3]]
    
      [[10  8]
       [ 6 11]]]]
    

    【讨论】:

    • einsum 这里是对产品求和,对吧?如果我们想将v 中的每个元素相加,而不是相乘,该怎么办?例如,通过添加,第一个 2x2 将是 [[4 6] [0 3] 而不是 [[0 0] [0 0]]
    • @AisforAmbition 我错过了这个问题。是的你可以。我添加了一个编辑来涵盖添加。感谢您发现差异。
    • add 方法很有意义。您基本上将每个v_i“嵌套”到要使用 2x2 矩阵广播的所需位置。谢谢!
    猜你喜欢
    • 2021-06-10
    • 2023-04-04
    • 2014-04-06
    • 2020-06-25
    • 1970-01-01
    • 2018-01-07
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多