【问题标题】:Multiplying 2d array by 1d array将二维数组乘以一维数组
【发布时间】:2016-04-15 11:19:45
【问题描述】:

我有一个形状为 (k,n) 的二维数组 a,我想将它与形状为 (m,) 的一维数组 b“相乘”:

a = np.array([[2, 8],
              [4, 7],
              [1, 2],
              [5, 2],
              [7, 4]])

b = np.array([3, 5, 5])

作为我正在寻找的“乘法”的结果:

array([[[2*3,2*5,2*5],[8*3,8*5,8*5]],
       [[4*3,4*5,4*5],[7*3,7*5,7*5]],
       [[1*3,1*5,1*5], ..... ]],
          ................. ]]])

= array([[[ 6, 10, 10],
          [24, 40, 40]],

         [[12, 20, 20],
          [21, 35, 35]],

         [[ 3,  5,  5],
          [ ........ ]],

             ....... ]]])

我当然可以用循环来解决它,但我正在寻找一种快速的矢量化方法。

【问题讨论】:

    标签: python arrays performance numpy vectorization


    【解决方案1】:

    将a 扩展到 3D 数组案例,方法是在末尾添加一个新轴,使用 np.newaxis/None,然后使用 b 进行元素乘法,引入 broadcasting 以获得矢量化解决方案,就像这样 -

    b*a[...,None]
    

    示例运行 -

    In [19]: a
    Out[19]: 
    array([[2, 8],
           [4, 7],
           [1, 2],
           [5, 2],
           [7, 4]])
    
    In [20]: b
    Out[20]: array([3, 5, 5])
    
    In [21]: b*a[...,None]
    Out[21]: 
    array([[[ 6, 10, 10],
            [24, 40, 40]],
    
           [[12, 20, 20],
            [21, 35, 35]],
    
           [[ 3,  5,  5],
            [ 6, 10, 10]],
    
           [[15, 25, 25],
            [ 6, 10, 10]],
    
           [[21, 35, 35],
            [12, 20, 20]]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-12
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 2018-01-03
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      相关资源
      最近更新 更多