在 Numpy 中,矩阵乘法(Matrix Multiplication)与普通的逐元素乘法不同,它遵循线性代数中的矩阵乘法规则,即 两个矩阵的相乘是行列之间的内积。Numpy 提供了多种方式来进行矩阵乘法,最常用的有:
dot()
或np.dot()
:适用于一维、二维和更高维的矩阵乘法。@
操作符:从 Python 3.5 起支持,直接用于矩阵乘法。matmul()
:专门用于矩阵乘法。
矩阵乘法规则:
假设我们有两个矩阵 ( A ) 和 ( B ),如果 ( A ) 是 ( m \times n ) 矩阵,( B ) 是 ( n \times p ) 矩阵,那么它们的乘积矩阵 ( C ) 的形状是 ( m \times p ),其中每个元素 ( C_{ij} ) 是 ( A ) 的第 ( i ) 行和 ( B ) 的第 ( j ) 列的内积。
1. 使用 dot()
进行矩阵乘法
import numpy as np# 定义两个矩阵
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])# 矩阵乘法
C = np.dot(A, B)
print(C)
输出:
[[19 22][43 50]]
解释:
- ( C[0, 0] = 15 + 27 = 19 )
- ( C[0, 1] = 16 + 28 = 22 )
- ( C[1, 0] = 35 + 47 = 43 )
- ( C[1, 1] = 36 + 48 = 50 )
2. 使用 @
操作符进行矩阵乘法
从 Python 3.5 起,可以直接使用 @
操作符进行矩阵乘法。
C = A @ B
print(C)
输出:
[[19 22][43 50]]
与 dot()
的输出相同。@
是一种更简洁的矩阵乘法表示法,尤其是在链式矩阵乘法时。
3. 使用 matmul()
进行矩阵乘法
matmul()
函数专门用于矩阵乘法,与 dot()
不同,它只处理矩阵乘法,而 dot()
可以处理任意维度数组。
C = np.matmul(A, B)
print(C)
输出:
[[19 22][43 50]]
4. 多维矩阵乘法
Numpy 支持高维矩阵的乘法运算。对于高维矩阵,矩阵乘法的计算规则扩展到沿着最后的轴进行。
A = np.random.randint(1, 10, (2, 3, 4))
B = np.random.randint(1, 10, (2, 4, 5))# 三维矩阵乘法,输出形状为 (2, 3, 5)
C = np.matmul(A, B)
print(C.shape)
print(C)
输出示例:
(2, 3, 5)
[[[109 110 64 97 69][115 124 74 107 83][119 142 77 113 101]][[113 95 72 101 78][135 135 106 130 117][122 106 82 105 94]]]
5. 矩阵与向量的乘法
矩阵乘法不仅适用于矩阵与矩阵,也适用于矩阵与向量之间的乘法。
A = np.array([[1, 2, 3], [4, 5, 6]])
v = np.array([7, 8, 9])# 矩阵与向量相乘
C = np.dot(A, v)
print(C)
输出:
[ 50 122]
解释:
- ( C[0] = 17 + 28 + 3*9 = 50 )
- ( C[1] = 47 + 58 + 6*9 = 122 )
6. 逐元素乘法 vs 矩阵乘法
逐元素乘法是指矩阵中的对应元素逐一相乘,而不是矩阵乘法中的内积。
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])# 逐元素乘法(使用 * 操作符)
elementwise_mul = A * B
print(elementwise_mul)
输出:
[[ 5 12][21 32]]
在逐元素乘法中,每个位置的值是两个矩阵中相应位置元素的乘积:
- ( A[0,0] \times B[0,0] = 1 \times 5 = 5 )
- ( A[0,1] \times B[0,1] = 2 \times 6 = 12 )
- ( A[1,0] \times B[1,0] = 3 \times 7 = 21 )
- ( A[1,1] \times B[1,1] = 4 \times 8 = 32 )
总结:
- 矩阵乘法:使用
dot()
、matmul()
或@
,遵循线性代数的矩阵内积规则。 - 逐元素乘法:使用
*
,对应位置元素逐一相乘。 - 广播机制:Numpy 广播机制允许不同维度的数组进行矩阵乘法。