python np.dot()、np.multiply()、np.matmul()、@、*的用法与区别

基本概念

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

点积

点积:指实数域中的两个向量运算得到一个实数值标量。
对于向量 a = ( x 1 , y 1 ) 和向量 b = ( x 2 , y 2 ) , 它们的点积表示为 a ⋅ b = x 1 x 2 + y 1 y 2 。 对于向量a=(x_1,y_1)和向量b=(x_2,y_2),\\它们的点积表示为a\cdot b=x_1x_2+y_1y_2。 对于向量a=(x1,y1)和向量b=(x2,y2)它们的点积表示为ab=x1x2+y1y2

矩阵乘法

两个矩阵运算需要满足矩阵乘法的规则,即前一个矩阵的列数等于后一个矩阵的行数。
矩阵 A = [ a 11 a 12 a 21 a 22 ] ,矩阵 B = [ b 11 b 12 b 21 b 22 ] A B = [ a 11 ∗ b 11 + a 12 ∗ b 21 a 11 ∗ b 12 + a 12 ∗ b 22 a 21 ∗ b 11 + a 22 ∗ b 21 a 21 ∗ b 12 + a 22 ∗ b 22 ] 矩阵A=\begin{bmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{bmatrix},矩阵B=\begin{bmatrix} b_{11} & b_{12} \\ b_{21} & b_{22} \end{bmatrix} \\ AB=\begin{bmatrix} a_{11}*b_{11}+a_{12}*b_{21} & a_{11}*b_{12}+a_{12}*b_{22} \\ a_{21}*b_{11}+a_{22}*b_{21} & a_{21}*b_{12}+a_{22}*b_{22} \end{bmatrix} 矩阵A=[a11a21a12a22],矩阵B=[b11b21b12b22]AB=[a11b11+a12b21a21b11+a22b21a11b12+a12b22a21b12+a22b22]

np.dot()与@

np.dot()与@的用法相同。
对于秩为1的数组,执行点积运算;
对于秩不为1的二维数组,执行矩阵乘法;

秩为1的情况

dot

>>> A = np.arange(1,5)
>>> A
array([1, 2, 3, 4])

>>> B = np.arange(0,4)
>>> B
array([0, 1, 2, 3])

>>> np.dot(A,B)
20

@

>>> A = np.arange(1,4)
>>> A
array([1, 2, 3])

>>> B = np.arange(0,3)
>>> B
array([0, 1, 2])

>>> A@B
8

秩不为1的情况

dot

>>> A = np.arange(1,5).reshape(2,2)
>>> A
array([[1, 2],
       [3, 4]])

>>> B = np.arange(0,4).reshape(2,2)
>>> B
array([[0, 1],
       [2, 3]])

>>> np.dot(A,B)
array([[ 4,  7],
       [ 8, 15]])

@

>>> A = np.arange(1,7).reshape(2,-1)
>>> A
array([[1, 2, 3],
       [4, 5, 6]])
       
>>> B = np.arange(1,7).reshape(-1,2)
>>> B
array([[1, 2],
       [3, 4],
       [5, 6]])
       
>>> (np.mat(A))@(np.mat(B))
matrix([[22, 28],
        [49, 64]])

np.multiply()

数组与矩阵对应位置相乘,输出与相乘的矩阵or数组大小相同

与数组相乘

A = np.arange(1,5).reshape(2,2)
>>> A
array([[1, 2],
       [3, 4]])
  
>>> B = np.arange(0,4).reshape(2,2)
>>> B
array([[0, 1],
       [2, 3]])
       
>>> np.multiply(A,B)
array([[ 0,  2],
       [ 6, 12]])

与矩阵相乘

数组会自适应按列相乘还是按行相乘。

>>> A = np.arange(1,3).reshape(2,1)
>>> A
array([[1],
       [2]])
       
>>> B
array([[0, 1],
       [2, 3]])
       
>>> np.multiply(A,np.mat(B))
matrix([[0, 1],
        [4, 6]])

>>> A
array([[1, 2]])

>>> B
array([[0, 1],
       [2, 3]])
       
>>> np.multiply(A,np.mat(B))
matrix([[0, 2],
        [2, 6]])

np.matmul()

matmul是matrix multiply的缩写,所以他是专门用于矩阵乘法的函数。

>>> A = np.arange(1,7).reshape(2,-1)
>>> A
array([[1, 2, 3],
       [4, 5, 6]])
       
>>> B = np.arange(1,7).reshape(-1,2)
>>> B
array([[1, 2],
       [3, 4],
       [5, 6]])
       
>>> np.matmul(np.mat(A), np.mat(B))
matrix([[22, 28],
        [49, 64]])

*

对数组执行对应位置相乘
对矩阵执行矩阵相乘

数组相乘

>>> A
array([1, 2, 3])

>>> B
array([0, 1, 2])

>>> A*B
array([0, 2, 6])

矩阵相乘

>>> A = np.arange(1,5).reshape(2,2)
>>> A
array([[1, 2],
       [3, 4]])
       
>>> B = np.arange(0,4).reshape(2,2)
>>> B
array([[0, 1],
       [2, 3]])
       
>>> (np.mat(A))*(np.mat(B))
matrix([[ 4,  7],
        [ 8, 15]])
### Python Numpy `np.dot` 函数详解 #### 功能描述 `np.dot` 是 NumPy 库中的一个重要函数,用于计算两个数组间的点积。对于二维数组而言,这相当于执行矩阵乘法;而对于一维数组,则是它们对应位置元素相乘后的求和操作[^1]。 #### 参数解释 该方法接受两个主要参数: - **a**: 输入的第一个数组。 - **b**: 输入的第二个数组。 此外还可以接收其他可选参数如 `out` 来指定输出缓冲区的位置[^2]。 #### 返回值 返回的是输入数组按规则计算得到的结果数组或标量值(当两者均为向量时)。如果第一个参数是一维而另一个不是,则会抛出错误提示不兼容的操作数形状[^4]。 #### 示例代码展示 下面通过具体例子来理解如何使用此功能: ```python import numpy as np # 一维数组之间做内积运算 vector_a = np.array([1, 2, 3]) vector_b = np.array([4, 5, 6]) result_vector_dot = vector_a @ vector_b # 或者使用 np.dot(vector_a, vector_b) print(f"Vector dot product result: {result_vector_dot}") # 输出应为 32 # 矩阵间进行标准矩阵乘法 matrix_c = np.mat([[1, 2], [3, 4]]) matrix_d = np.mat([[4, 5], [6, 7]]) result_matrix_multiply = matrix_c * matrix_d # 对于mat对象可以直接用*号代替dot() alternative_result = np.dot(matrix_c, matrix_d) print("Matrix multiplication results:") print(alternative_result) ``` 上述代码展示了两种不同类型的输入——向量矩阵下 `np.dot()` 的应用方式及其预期输出效果[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳叶lhy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值