numpy矩阵运算
NumPy 是 Python 中用于科学计算的核心库,提供了强大的矩阵和数组运算功能。以下是 NumPy 矩阵运算的全面介绍:
一、矩阵创建与基本操作
1. 创建矩阵
import numpy as np# 从列表创建
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("2D数组:\n", matrix)# 创建特殊矩阵
zeros = np.zeros((3, 3)) # 零矩阵
ones = np.ones((2, 4)) # 全1矩阵
identity = np.eye(3) # 单位矩阵
random_matrix = np.random.rand(3, 3) # 随机矩阵
range_matrix = np.arange(12).reshape(3, 4) # 范围矩阵print("零矩阵:\n", zeros)
print("单位矩阵:\n", identity)
2. 矩阵属性
matrix = np.array([[1, 2, 3], [4, 5, 6]])print("形状:", matrix.shape) # (2, 3)
print("维度:", matrix.ndim) # 2
print("元素总数:", matrix.size) # 6
print("数据类型:", matrix.dtype) # int64
二、基本数学运算
1. 元素级运算
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])# 基本运算
print("加法:\n", A + B) # 元素相加
print("减法:\n", A - B) # 元素相减
print("乘法:\n", A * B) # 元素相乘(哈达玛积)
print("除法:\n", A / B) # 元素相除
print("幂运算:\n", A ** 2) # 每个元素平方# 广播运算
print("标量加法:\n", A + 10) # 每个元素加10
print("标量乘法:\n", A * 3) # 每个元素乘3
2. 矩阵乘法
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])# 矩阵乘法(点积)
matrix_product = np.dot(A, B)
# 或使用 @ 运算符(Python 3.5+)
matrix_product_alt = A @ Bprint("矩阵乘法:\n", matrix_product)
# [[19 22]
# [43 50]]
三、线性代数运算
1. 矩阵分解
# 特征值和特征向量
matrix = np.array([[4, -2], [1, 1]])
eigenvalues, eigenvectors = np.linalg.eig(matrix)
print("特征值:", eigenvalues)
print("特征向量:\n", eigenvectors)# 奇异值分解 (SVD)
U, S, Vt = np.linalg.svd(matrix)
print("U矩阵:\n", U)
print("奇异值:", S)
print("V转置矩阵:\n", Vt)# QR分解
Q, R = np.linalg.qr(matrix)
print("Q矩阵:\n", Q)
print("R矩阵:\n", R)
2. 矩阵求逆与行列式
matrix = np.array([[1, 2], [3, 4]])# 矩阵求逆
inverse = np.linalg.inv(matrix)
print("逆矩阵:\n", inverse)# 行列式
det = np.linalg.det(matrix)
print("行列式:", det)# 验证:矩阵 × 逆矩阵 = 单位矩阵
identity_check = matrix @ inverse
print("验证逆矩阵:\n", np.round(identity_check, 10))
3. 线性方程组求解
# 解 Ax = b
A = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])# 方法1: 直接求解
x = np.linalg.solve(A, b)
print("解向量:", x) # [2. 3.]# 验证解
print("验证:", A @ x) # 应该等于 [9, 8]# 方法2: 使用逆矩阵
x_alt = np.linalg.inv(A) @ b
print("逆矩阵解法:", x_alt)
四、统计运算
1. 基本统计
matrix = np.array([[1, 2, 3],[4, 5, 6], [7, 8, 9]])print("总和:", np.sum(matrix))
print("平均值:", np.mean(matrix))
print("标准差:", np.std(matrix))
print("方差:", np.var(matrix))
print("最小值:", np.min(matrix))
print("最大值:", np.max(matrix))# 沿特定轴统计
print("每列总和:", np.sum(matrix, axis=0)) # [12 15 18]
print("每行平均值:", np.mean(matrix, axis=1)) # [2. 5. 8.]
2. 累积运算
matrix = np.array([[1, 2, 3],[4, 5, 6]])print("累积和:\n", np.cumsum(matrix))
# [ 1 3 6 10 15 21]print("按行累积和:\n", np.cumsum(matrix, axis=1))
# [[ 1 3 6]
# [ 4 9 15]]
五、矩阵操作与变形
1. 矩阵变形
matrix = np.arange(12)
print("原始数组:", matrix)# 改变形状
reshaped = matrix.reshape(3, 4)
print("重塑为3x4:\n", reshaped)# 转置
transposed = reshaped.T
print("转置矩阵:\n", transposed)# 展平
flattened = reshaped.flatten()
print("展平数组:", flattened)
2. 矩阵拼接
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])# 水平拼接
horizontal = np.hstack([A, B])
print("水平拼接:\n", horizontal)# 垂直拼接
vertical = np.vstack([A, B])
print("垂直拼接:\n", vertical)# 使用 concatenate
concat_axis0 = np.concatenate([A, B], axis=0) # 垂直
concat_axis1 = np.concatenate([A, B], axis=1) # 水平
六、高级运算
1. 广播机制
# 向量与矩阵运算
matrix = np.array([[1, 2, 3],[4, 5, 6], [7, 8, 9]])
vector = np.array([10, 20, 30])# 广播:向量被扩展到与矩阵相同的形状
result = matrix + vector
print("矩阵 + 向量:\n", result)
# [[11 22 33]
# [14 25 36]
# [17 28 39]]# 更复杂的广播
A = np.array([[1], [2], [3]]) # 形状 (3, 1)
B = np.array([10, 20]) # 形状 (2,)
result = A + B # 广播到 (3, 2)
print("复杂广播:\n", result)
2. 矩阵范数
matrix = np.array([[1, 2], [-3, 4]])print("Frobenius范数:", np.linalg.norm(matrix))
print("1-范数:", np.linalg.norm(matrix, ord=1))
print("2-范数:", np.linalg.norm(matrix, ord=2))
print("无穷范数:", np.linalg.norm(matrix, ord=np.inf))
3. 迹与对角元素
matrix = np.array([[1, 2, 3],[4, 5, 6], [7, 8, 9]])print("矩阵的迹:", np.trace(matrix)) # 15 (1+5+9)
print("对角元素:", np.diag(matrix)) # [1 5 9]
print("创建对角矩阵:\n", np.diag([1, 2, 3]))
七、性能优化技巧
1. 向量化操作
import time# 非向量化(慢)
def slow_operation(matrix):result = np.zeros_like(matrix)for i in range(matrix.shape[0]):for j in range(matrix.shape[1]):result[i, j] = matrix[i, j] ** 2 + 2 * matrix[i, j] + 1return result# 向量化(快)
def fast_operation(matrix):return matrix ** 2 + 2 * matrix + 1# 性能测试
large_matrix = np.random.rand(1000, 1000)start = time.time()
result1 = slow_operation(large_matrix)
time1 = time.time() - startstart = time.time()
result2 = fast_operation(large_matrix)
time2 = time.time() - startprint(f"循环版本: {time1:.4f}秒")
print(f"向量化版本: {time2:.4f}秒")
print(f"加速比: {time1/time2:.1f}倍")
2. 内存布局优化
# C顺序 vs F顺序
matrix_c = np.array([[1, 2, 3], [4, 5, 6]], order='C') # 行优先
matrix_f = np.array([[1, 2, 3], [4, 5, 6]], order='F') # 列优先print("C顺序:", matrix_c.flags['C_CONTIGUOUS']) # True
print("F顺序:", matrix_f.flags['F_CONTIGUOUS']) # True
八、实际应用示例
1. 图像处理模拟
# 模拟灰度图像处理
image = np.random.randint(0, 256, (100, 100), dtype=np.uint8)
print("原始图像形状:", image.shape)# 图像卷积核(边缘检测)
kernel = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1, -1]])# 简单的卷积操作(简化版)
def simple_convolution(image, kernel):h, w = image.shapekh, kw = kernel.shapepad_h, pad_w = kh // 2, kw // 2# 填充图像padded = np.pad(image, ((pad_h, pad_h), (pad_w, pad_w)), mode='constant')result = np.zeros_like(image, dtype=float)# 卷积计算for i in range(h):for j in range(w):region = padded[i:i+kh, j:j+kw]result[i, j] = np.sum(region * kernel)return np.clip(result, 0, 255).astype(np.uint8)# 应用卷积
edges = simple_convolution(image, kernel)
print("边缘检测完成")
2. 数据标准化
# 生成模拟数据
data = np.random.normal(5, 2, (100, 5)) # 100个样本,5个特征# Z-score标准化
def standardize(data):mean = np.mean(data, axis=0)std = np.std(data, axis=0)return (data - mean) / std# Min-Max标准化
def normalize(data):min_vals = np.min(data, axis=0)max_vals = np.max(data, axis=0)return (data - min_vals) / (max_vals - min_vals)standardized_data = standardize(data)
normalized_data = normalize(data)print("原始数据均值:", np.mean(data, axis=0))
print("标准化后均值:", np.mean(standardized_data, axis=0))
print("标准化后方差:", np.var(standardized_data, axis=0))
总结
NumPy 矩阵运算的核心优势:
- 高性能:底层用 C/Fortran 实现
- 向量化:避免 Python 循环,提升效率
- 广播机制:智能处理不同形状数组的运算
- 丰富的线性代数函数:覆盖大多数数学需求
掌握 NumPy 矩阵运算是进行科学计算、机器学习和数据分析的基础。