什么是乘法运算符实际上与numpy数组做什么?

时间:2013-08-17 22:09:52

标签: python numpy

我正在学习NumPy,我不确定运算符*实际上在做什么。这似乎是某种形式的乘法,但我不确定它是如何确定的。来自ipython:

In [1]: import numpy as np

In [2]: a=np.array([[1,2,3]])

In [3]: b=np.array([[4],[5],[6]])

In [4]: a*b
Out[4]: 
array([[ 4,  8, 12],
       [ 5, 10, 15],
       [ 6, 12, 18]])

In [5]: b*a
Out[5]: 
array([[ 4,  8, 12],
       [ 5, 10, 15],
       [ 6, 12, 18]])

In [6]: b.dot(a)
Out[6]: 
array([[ 4,  8, 12],
       [ 5, 10, 15],
       [ 6, 12, 18]])

In [7]: a.dot(b)
Out[7]: array([[32]])

似乎正在进行矩阵乘法,但只有b乘以a,而不是相反。发生了什么事?

2 个答案:

答案 0 :(得分:15)

这有点复杂,与broadcasting的概念以及所有numpy操作都是元素明智的事实有关。

  1. a是一个包含1行和3列的2D数组,b是一个包含1列和3行的2D数组。
  2. 如果你试图逐个元素地将它们相乘(这是numpy尝试做的a * b,因为除了dot操作之外的每个基本操作都是元素明智的),它必须广播数组这样它们就可以匹配所有尺寸。
  3. 由于第一个阵列是1x3而第二个是3x1,因此可以根据广播规则将它们广播为3x3矩阵。它们看起来像:
  4. a = [[1, 2, 3],
         [1, 2, 3],
         [1, 2, 3]]
    
    b = [[4, 4, 4],
         [5, 5, 5],
         [6, 6, 6]]
    

    现在Numpy可以逐个元素地将它们相乘,给你结果:

    [[ 4,  8, 12],
     [ 5, 10, 15],
     [ 6, 12, 18]]
    

    当您进行.dot操作时,它执行标准矩阵乘法。更多docs

答案 1 :(得分:6)

*进行元素乘法。

由于数组具有不同的形状,因此将应用broadcasting规则。

In [5]: a.shape
Out[5]: (1, 3)

In [6]: b.shape
Out[6]: (3, 1)

In [7]: (a * b).shape
Out[7]: (3, 3)
  1. 所有输入数组的ndim小于最大ndim的输入数组,其形状前面有1个(不适用于此)。
  2. 输出形状的每个维度的大小是该维度中所有输入大小的最大值。
  3. 如果输入在特定维度中的大小与该维度中的输出大小匹配,或者其值恰好为1,则可以在计算中使用该输入。
  4. 如果输入的形状尺寸为1,则该维度中的第一个数据条目将用于沿该维度的所有计算。换句话说,ufunc的步进机器将不会沿着该维度步进(对于该维度,步幅将为0)。
  5. 因此,生成的形状必须为(3, 3)ab尺寸大小的最大值),并且在执行乘法时numpy不会逐步执行第一维和b的第二维(它们的大小是1)。

    结果的[i][j]元素等于广播的ab的{​​{1}}元素的乘积。

    [i][j]