我正在学习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
,而不是相反。发生了什么事?
答案 0 :(得分:15)
这有点复杂,与broadcasting的概念以及所有numpy操作都是元素明智的事实有关。
a
是一个包含1行和3列的2D数组,b
是一个包含1列和3行的2D数组。a * b
,因为除了dot
操作之外的每个基本操作都是元素明智的),它必须广播数组这样它们就可以匹配所有尺寸。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)
因此,生成的形状必须为(3, 3)
(a
和b
尺寸大小的最大值),并且在执行乘法时numpy不会逐步执行第一维和b的第二维(它们的大小是1)。
结果的[i][j]
元素等于广播的a
和b
的{{1}}元素的乘积。
[i][j]