首先,我们需要区分几个概念:
点积(dot product),又称为数量积、标量积(scalar product)或者内积(inner product),它是指实数域中的两个向量运算得到一个实数值标量的二元运算。
则对于向量 a = ( x 1 , y 1 ) a = (x_{1}, y_{1}) a=(x1,y1)和 b = ( x 2 , y 2 ) b = (x_{2}, y_{2}) b=(x2,y2),它们的点积就表示为: a ⋅ b = x 1 x 2 + y 1 y 2 a \cdot b = x_{1}x_{2} + y_{1}y_{2} a⋅b=x1x2+y1y2
矩阵乘法(matrix multiplication),两个运算的矩阵需要满足矩阵乘法的规则,即需要前一个矩阵的列与后一个矩阵的行相匹配。
需要注意的是,上面的两个概念都是针对向量或者矩阵的运算,需要和标量的计算区分开来。
下面分别对几个经常用到,而又容易混淆的方法进行代码演示:
1、np.dot()
如果参与运算的两个一维数组,那么得到的结果是两个数组的内积(inner product);
a = np.array([1,2,3])
b = np.array([1,2,3])
print(np.dot(a, b))
>> 14
如果参与运算的是两个二维数组,那么得到的结果是矩阵乘积(matrix multiplication),两个参与运算的矩阵需要满足矩阵乘法的规则,但是官方更推荐使用np.matmul()和@用于矩阵乘法。
A = np.array([[1,2,3],
[4,5,6]])
B = np.array([[1,2],
[3,4],
[5,6]])
print(np.dot(A, B))
>>[[22 28]
[49 64]]
2、np.multiply()
和*
星号和np.multiply()方法是针对的是标量的运算,当参与运算的是两个数组时,得到的结果是两个数组进行对应位置的乘积(element-wise product),输出的结果与参与运算的数组或者矩阵的大小一致。
A = np.array([[1,2,3],
[4,5,6]])
B = np.array([[1,2,3],
[4,5,6]])
a = np.array([1,2,3])
b = np.array([1,2,3])
print(np.multiply(A, B))
print(np.multiply(a, b))
>>[[ 1 4 9]
[16 25 36]]
[1 4 9]
3、np.matmul()
和@
matmul是matrix multiply的缩写,所以即是专门用于矩阵乘法的函数。另外,@运算方法和matmul()则是一样的作用,相当于简便写法。
=A = np.array([[1,2,3],
[4,5,6]])
B = np.array([[1,2],
[3,4],
[5,6]])
print(np.matmul(A, B))
print(A @ B)
>>[[22 28]
[49 64]]
[[22 28]
[49 64]]
使用哪种方法都有其具体应用场景,根据需要计算的数组是标量还是向量来决定使用哪种方法。另外,根据numpy中源码的注释,官方更推荐下面的方式:
当进行向量的内积运算时,可以通过np.dot()
当进行矩阵的乘法运算时,可以通过np.matmul()或者@
当进行标量的乘法运算时,可以通过np.multiply()或者*