矩阵加法、减法、标量乘法、转置和矩阵乘法是线性代数的基础。使用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 \times A$ (维度 3x2 和 2x3 兼容,结果是 3x3)并与 $A \times 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 \times C$ 和 $C \times A$ 是不同的。即使形状允许两种乘法运算并得到相同大小的矩阵,结果通常也是不同的。运算总结以下是我们已实践过的 NumPy 运算的快速参考:加法: matrix1 + matrix2减法: matrix1 - matrix2标量乘法: scalar * matrix转置: matrix.T 或 np.transpose(matrix)矩阵乘法: matrix1 @ matrix2 或 np.dot(matrix1, matrix2)这些基本运算构成了机器学习算法中许多计算的组成部分。多加练习,直到你熟练掌握。当你处理以矩阵形式表示的数据时,你会经常使用它们。