numpy学习笔记7:np.dot(a, b) 详细解释
numpy学习笔记7:np.dot(a, b) 详细解释
np.dot(a, b)
函数详解
np.dot(a, b)
是 NumPy 中用于计算两个数组的点积或矩阵乘法的核心函数。其行为根据输入数组的维度不同而变化,以下是详细说明:
1. 输入为两个一维数组(向量)
-
作用:计算向量内积(对应元素相乘后求和)。
-
公式:结果=∑i=1nai⋅bi结果=∑i=1nai⋅bi。
-
示例:
import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) result = np.dot(a, b) # 1*4 + 2*5 + 3*6 = 32 print(result) # 输出: 32
2. 输入为一个二维数组(矩阵)和一个一维数组(向量)
-
作用:矩阵与向量的乘法,结果为向量。
-
条件:矩阵的列数必须等于向量的长度。
-
示例:
matrix = np.array([[1, 2], [3, 4]]) # 形状 (2, 2) vector = np.array([5, 6]) # 形状 (2,) result = np.dot(matrix, vector) # [1*5 + 2*6, 3*5 + 4*6] = [17, 39] print(result) # 输出: [17 39]
3. 输入为两个二维数组(矩阵)
-
作用:矩阵乘法。
-
条件:第一个矩阵的列数必须等于第二个矩阵的行数。
-
示例:
a = np.array([[1, 2], [3, 4]]) # 形状 (2, 2) b = np.array([[5, 6], [7, 8]]) # 形状 (2, 2) result = np.dot(a, b) # [[1*5+2*7, 1*6+2*8], [3*5+4*7, 3*6+4*8]] print(result) # 输出: [[19 22], [43 50]]
4. 输入为高维数组(三维及以上)
-
作用:沿指定轴求和,遵循张量乘法规则。
-
规则:
np.dot(a, b)
对a
的最后一个轴和b
的倒数第二个轴进行乘积求和。 -
示例:
a = np.ones((2, 3, 4)) # 形状 (2, 3, 4) b = np.ones((2, 4, 5)) # 形状 (2, 4, 5) result = np.dot(a, b) # 形状 (2, 3, 2, 5)
-
结果形状推导:保留
a
的前两个轴(2, 3)
和b
的后两个轴(2, 5)
,合并中间的维度4
。
-
5. 输入包含标量
-
作用:标量与数组的普通乘法。
-
示例:
a = 5 b = np.array([1, 2, 3]) result = np.dot(a, b) # 等同于 5 * b → [5, 10, 15] print(result) # 输出: [5 10 15]
6. 与 @
运算符和 np.matmul()
的区别
功能 | np.dot(a, b) | a @ b 或 np.matmul(a, b) |
---|---|---|
一维数组 | 内积(标量) | 外积(错误,需显式处理) |
高维数组 | 张量积(按最后两轴计算) | 广播矩阵乘法(按最后两轴计算) |
标量乘法 | 支持 | 不支持(需显式乘法) |
7. 常见错误与注意事项
-
维度不匹配:
a = np.array([[1, 2], [3, 4]]) # 形状 (2, 2) b = np.array([1, 2, 3]) # 形状 (3,) np.dot(a, b) # 报错:shapes (2,2) and (3,) not aligned
-
性能优化:对大型数组,
np.dot()
默认使用优化后的 BLAS 库(如 Intel MKL),效率极高。 -
内存共享:结果数组是新的对象,不与输入数组共享内存。
总结
-
一维数组 → 向量内积。
-
二维数组 → 矩阵乘法。
-
高维数组 → 张量积(沿特定轴计算)。
-
标量 → 普通乘法。
-
替代操作:
@
运算符更适用于矩阵乘法,np.dot()
更通用。