【python】np.dot()、np.multiply()、np.matmul()方法以及*和@运算符的用法总结

几个概念

首先,我们需要区分几个概念:
点积(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} ab=x1x2+y1y2

矩阵乘法(matrix multiplication),两个运算的矩阵需要满足矩阵乘法的规则,即需要前一个矩阵的列与后一个矩阵的行相匹配。

需要注意的是,上面的两个概念都是针对向量或者矩阵的运算,需要和标量的计算区分开来。

Python代码实现

下面分别对几个经常用到,而又容易混淆的方法进行代码演示:

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()或者*

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值