【问题标题】:Elementwise multiplication of NumPy arrays of different shapes不同形状的 NumPy 数组的元素乘法
【发布时间】:2018-12-23 04:14:23
【问题描述】:

当我使用 numpy.multiply(a,b) 将 numpy 数组与形状 (2, 1),(2,) 相乘时,我得到一个 2 x 2 矩阵。但我想要的是逐元素乘法。

我不熟悉 numpy 的规则。谁能解释这里发生了什么?

【问题讨论】:

标签: numpy matrix vector linear-algebra multiplication


【解决方案1】:

当在两个不同维数相同的数组之间进行元素操作时,NumPy 将执行广播。在您的情况下,Numpy 将沿着 a 的行广播 b

import numpy as np
a = np.array([[1],
              [2]])
b = [3, 4]
print(a * b)

给予:

[[3 4]
 [6 8]]

为防止这种情况,您需要使ab 具有相同的维度。您可以在索引中使用np.newaxisNone 向数组添加维度,如下所示:

print(a * b[:, np.newaxis]) 

给予:

[[3]
 [8]]

【讨论】:

    【解决方案2】:

    这里是输入数组ab,与您提到的形状相同:

    In [136]: a
    Out[136]: 
    array([[0],
           [1]])
    
    In [137]: b
    Out[137]: array([0, 1])
    

    现在,当我们使用*numpy.multiply(a, b) 进行乘法运算时,我们得到:

    In [138]: a * b
    Out[138]: 
    array([[0, 0],
           [0, 1]])
    

    结果是一个(2,2) 数组,因为 numpy 使用广播。

           # b
        #a | 0     1
         ------------
         0 | 0*0   0*1
         1 | 1*0   1*1
    

    【讨论】:

      【解决方案3】:

      假设您有两个数组,ab,形状分别为 (2,3)(2,)

      a = np.random.randint(10, size=(2,3))
      b = np.random.randint(10, size=(2,))
      

      这两个数组,例如,包含:

      a = np.array([[8, 0, 3],
                    [2, 6, 7]])
      b = np.array([7, 5])
      

      现在要处理一个产品元素到元素a*b,您必须指定numpy 在到达数组b 的缺席axis=1 时必须做什么。你可以通过添加None来做到这一点:

      result = a*b[:,None]
      

      result 是:

      array([[56,  0, 21],
             [10, 30, 35]])
      

      【讨论】:

        【解决方案4】:

        我刚刚在broadcasting arrays in numpy解释了广播规则

        你的情况

        (2,1) + (2,) => (2,1) + (1,2) => (2,2)
        

        它必须给第二个参数添加一个维度,并且只能在开头添加它(以避免歧义)。

        所以你想要一个 (2,1) 结果,你必须自己扩展第二个参数,使用reshape[:, np.newaxis]

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-11-20
          • 2015-05-13
          • 1970-01-01
          • 2019-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多