在Python的科学计算领域,Numpy是处理矩阵和数组的核心库。无论是数据分析、机器学习还是线性代数问题,熟练掌握Numpy矩阵操作都是基础。本文将用最简单的方式讲解矩阵的乘法、转置与逆矩阵,适合初学者快速上手。
一、Numpy与矩阵基础¶
首先,确保你已经安装了Numpy库(如果没安装,可通过pip install numpy安装)。Numpy提供了高效的多维数组和矩阵操作,其核心是ndarray对象,我们可以把矩阵看作是二维的ndarray。
1. 创建矩阵¶
用np.array()可以直接创建矩阵,只需传入一个嵌套列表:
import numpy as np
# 创建一个2×2的矩阵
matrix = np.array([[1, 2],
[3, 4]])
print(matrix)
# 输出:
# [[1 2]
# [3 4]]
2. 矩阵的基本属性¶
矩阵的形状(行数、列数)可以通过.shape查看,维度通过.ndim查看(矩阵是二维的,所以ndim=2):
print("形状:", matrix.shape) # 输出:形状: (2, 2)
print("维度:", matrix.ndim) # 输出:维度: 2
print("数据类型:", matrix.dtype) # 输出:数据类型: int64
二、矩阵乘法(点积)¶
矩阵乘法是线性代数中最核心的操作之一,需要注意矩阵乘法与普通数乘的区别。
1. 两种乘法的区别¶
-
元素对应相乘(Element-wise Multiplication):对应位置的元素相乘,在Numpy中用
*实现。但要求两个矩阵形状完全相同。 -
矩阵乘法(点积)(Dot Product):数学上要求前一个矩阵的列数等于后一个矩阵的行数(即
m×n矩阵与n×p矩阵相乘,结果为m×p矩阵)。在Numpy中用np.dot()或@运算符实现。
2. 矩阵乘法实例¶
假设我们有两个矩阵:
- A = [[1, 2], [3, 4]] (2×2)
- B = [[5, 6], [7, 8]] (2×2)
(1)元素相乘(*)¶
C = A * B # 形状必须相同,否则报错
print(C)
# 输出:
# [[ 5 12]
# [21 32]]
(2)矩阵乘法(np.dot()或@)¶
D = np.dot(A, B) # 等价于 A @ B
print(D)
# 输出:
# [[19 22]
# [43 50]]
验证形状:矩阵乘法后形状会变成(2,2)(原矩阵都是2×2),如果换成不同形状:
A = np.array([[1, 2, 3], [4, 5, 6]]) # 2×3矩阵
B = np.array([[7, 8], [9, 10], [11, 12]]) # 3×2矩阵
print(A @ B) # 结果形状应为2×2
# 输出:
# [[ 58 64]
# [139 154]]
三、矩阵转置¶
矩阵转置是指将矩阵的行和列互换,数学上记为A^T(或A.T)。
1. 转置操作¶
用.T属性实现转置,适用于二维矩阵(更高维数组同理):
A = np.array([[1, 2], [3, 4]])
A_T = A.T # 转置矩阵
print(A_T)
# 输出:
# [[1 3]
# [2 4]]
转置的形状:原矩阵(m,n)转置后变为(n,m):
print(A.shape) # 原形状:(2, 2)
print(A_T.shape) # 转置后形状:(2, 2)(因为原矩阵是方阵)
2. 转置的应用¶
转置常用于调整矩阵形状以适配乘法,例如:
A = np.array([[1, 2], [3, 4], [5, 6]]) # 3×2矩阵
B = np.array([[7, 8, 9], [10, 11, 12]]) # 2×3矩阵
# A和B直接相乘形状不匹配,但A.T是2×3矩阵,与B的形状相同
print((A.T @ B).shape) # 结果形状:(2, 3)
四、逆矩阵¶
逆矩阵是矩阵的“倒数”:如果矩阵A存在逆矩阵A^(-1),则满足A × A^(-1) = I(I为单位矩阵,对角线为1,其余为0)。
1. 逆矩阵的前提¶
- 必须是方阵:行数=列数(如2×2、3×3矩阵)。
- 行列式不为0:行列式可理解为矩阵的“缩放因子”,为0时矩阵不可逆。
2. 逆矩阵的Numpy实现¶
用np.linalg.inv()计算逆矩阵,需先导入np.linalg模块:
A = np.array([[2, 1], [4, 3]]) # 2×2方阵
A_inv = np.linalg.inv(A) # 计算逆矩阵
print(A_inv)
# 输出:
# [[ 1.5 -0.5]
# [-2. 1. ]]
验证逆矩阵:用矩阵乘法验证A × A_inv ≈ I(由于浮点误差,用np.allclose()更准确):
I = np.eye(2) # 单位矩阵
print(np.allclose(A @ A_inv, I)) # 输出:True
3. 注意事项¶
- 非方阵没有逆矩阵,例如
A = np.array([[1, 2], [3, 4], [5, 6]])(3×2矩阵)调用np.linalg.inv(A)会报错。 - 行列式为0的矩阵不可逆,例如
A = np.array([[1, 2], [2, 4]])(第二行是第一行的2倍):
det = np.linalg.det(A) # 计算行列式
print(det) # 输出:0.0(行列式为0,不可逆)
五、总结与练习¶
本文学习了Numpy中矩阵的三大基础操作:
- 乘法:区分元素相乘(*)和矩阵点积(np.dot()/@),注意形状匹配。
- 转置:用.T实现行变列,适用于调整矩阵形状。
- 逆矩阵:用np.linalg.inv()计算,仅方阵且行列式非零时存在。
小练习:尝试对本文中的矩阵A和B进行组合操作,例如(A.T @ B).T或验证A_inv × A是否为单位矩阵。
掌握这些基础后,你可以进一步学习矩阵的秩、特征值等更复杂的线性代数操作。Numpy作为科学计算的基石,多动手练习是提升熟练度的关键!