趋近智
本课程已归档: 现已推出包含更新教学大纲和改进内容的新版本。
矩阵加法、减法、标量乘法、转置和矩阵乘法是线性代数的基础。使用NumPy执行这些基本矩阵运算非常直接。动手实践有助于增强理解,并为在机器学习环境中的应用做好准备。
首先,请确保你已导入NumPy。我们将使用标准别名 np。我们还将定义一些矩阵,以便在这些例子中使用。
import numpy as np
# 定义矩阵A和B
A = np.array([[1, 2, 3],
[4, 5, 6]])
B = np.array([[7, 8, 9],
[10, 11, 12]])
# 定义用于乘法示例的矩阵C
C = np.array([[1, 0],
[0, 1],
[1, 1]])
print("矩阵A:")
print(A)
print("\n矩阵B:")
print(B)
print("\n矩阵C:")
print(C)
你应该能看到我们初始矩阵的定义被打印出来。请注意,A 和 B 具有相同的维度(2x3),这对于加法和减法运算来说很重要。矩阵 C 的维度是 3x2。
在NumPy中,矩阵的加法或减法就像使用标准的 + 和 - 运算符一样简单。NumPy会自动处理逐元素的运算。
# 矩阵加法 (A + B)
matrix_sum = A + B
print("矩阵和 (A + B):")
print(matrix_sum)
# 矩阵减法 (A - B)
matrix_diff = A - B
print("\n矩阵差 (A - B):")
print(matrix_diff)
结果:
矩阵和 (A + B):
[[ 8 10 12]
[14 16 18]]
矩阵差 (A - B):
[[-6 -6 -6]
[-6 -6 -6]]
请记住,矩阵加法和减法要求矩阵具有完全相同的维度。如果你尝试对维度不匹配的矩阵进行加法或减法运算,NumPy 将会引发 ValueError 错误。
将矩阵乘以标量(一个单独的数字)也非常直接。使用标准的 * 运算符。NumPy会将矩阵中的每个元素都乘以该标量。
# 标量乘法 (3 * A)
scalar = 3
scaled_matrix = scalar * A
print(f"标量乘法 ({scalar} * A):")
print(scaled_matrix)
结果:
标量乘法 (3 * A):
[[ 3 6 9]
[12 15 18]]
矩阵 A 中的每个元素都已乘以 3。
要转置矩阵(交换其行和列),你可以使用 .T 属性或 np.transpose() 函数。
# 使用 .T 进行矩阵转置
transpose_A = A.T
print("A的转置 (使用 .T):")
print(transpose_A)
print("\nA的形状:", A.shape)
print("A.T的形状:", transpose_A.shape)
# 使用 np.transpose() 进行矩阵转置
transpose_B = np.transpose(B)
print("\nB的转置 (使用 np.transpose()):")
print(transpose_B)
print("\nB的形状:", B.shape)
print("B.T的形状:", transpose_B.shape)
结果:
A的转置 (使用 .T):
[[1 4]
[2 5]
[3 6]]
A的形状: (2, 3)
A.T的形状: (3, 2)
B的转置 (使用 np.transpose()):
[[ 7 10]
[ 8 11]
[ 9 12]]
B的形状: (2, 3)
B.T的形状: (3, 2)
正如预期,2x3 矩阵 A 和 B 在转置后变为 3x2 矩阵。
这是线性代数和机器学习中的一个基本运算。请记住,矩阵乘法不是逐元素乘法(逐元素乘法使用 * 运算符)。对于真正的矩阵乘积(点积),请使用 @ 运算符或 np.dot() 函数。
@ 运算符是在 Python 3.5 中引入的,通常因其在矩阵乘法上的清晰性而更受青睐。
我们来将矩阵 A (2x3) 乘以矩阵 C (3x2)。内部维度匹配(3 和 3),因此乘法有效。结果矩阵的维度将是 2x2。
# 使用 @ 进行矩阵乘法
product_AC = A @ C
print("矩阵乘积 (A @ C):")
print(product_AC)
print("\nA的形状:", A.shape)
print("C的形状:", C.shape)
print("A @ C的形状:", product_AC.shape)
# 使用 np.dot() 进行矩阵乘法
product_AC_dot = np.dot(A, C)
print("\n矩阵乘积 (np.dot(A, C)):")
print(product_AC_dot)
结果:
矩阵乘积 (A @ C):
[[ 4 3]
[10 6]]
A的形状: (2, 3)
C的形状: (3, 2)
A @ C的形状: (2, 2)
矩阵乘积 (np.dot(A, C)):
[[ 4 3]
[10 6]]
两种方法都得到了相同的 2x2 结果。
如果维度不兼容会怎样?我们来尝试将 A (2x3) 乘以 B (2x3)。内部维度(3 和 2)不匹配。
# 尝试不兼容的乘法 (A @ B)
try:
incompatible_product = A @ B
print(incompatible_product)
except ValueError as e:
print("\n不兼容乘法 (A @ B) 时的错误:")
print(e)
结果:
不兼容乘法 (A @ B) 时的错误:
matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 3)
NumPy 正确地引发了 ValueError 错误,表示维度不匹配阻止了乘法运算。
请记住,矩阵乘法通常不具备交换律。我们来计算 C×A (维度 3x2 和 2x3 兼容,结果是 3x3)并与 A×C(它是 2x2)进行比较。
# 计算 C @ A (维度 3x2 @ 2x3 -> 3x3)
product_CA = C @ A
print("\n矩阵乘积 (C @ A):")
print(product_CA)
print("\nC @ A的形状:", product_CA.shape)
print("\nA @ C == C @ A 吗?", "由于形状不同,不适用。")
结果:
矩阵乘积 (C @ A):
[[ 1 2 3]
[ 4 5 6]
[ 5 7 9]]
C @ A的形状: (3, 3)
A @ C == C @ A 吗? 由于形状不同,不适用。
显然,A×C 和 C×A 是不同的。即使形状允许两种乘法运算并得到相同大小的矩阵,结果通常也是不同的。
以下是我们已实践过的 NumPy 运算的快速参考:
matrix1 + matrix2matrix1 - matrix2scalar * matrixmatrix.T 或 np.transpose(matrix)matrix1 @ matrix2 或 np.dot(matrix1, matrix2)这些基本运算构成了机器学习算法中许多计算的组成部分。多加练习,直到你熟练掌握。当你处理以矩阵形式表示的数据时,你会经常使用它们。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造