一 Numpy库
1.1 核心概念:ndarray
NumPy的核心是同质数据的多维数组(所有元素类型相同),相比Python列表具有:
内存效率高:连续内存存储
运算速度快:向量化操作,无需Python循环
功能丰富:广播、矩阵运算、随机数等
import numpy as np # 基础属性 arr = np.array([[1, 2, 3], [4, 5, 6]]) print(arr.ndim) # 维度数:2 print(arr.shape) # 形状:(2, 3) print(arr.dtype) # 数据类型:int64 print(arr.size) # 元素总数:61.2 数组创建方法
# 从Python结构转换 np.array([1, 2, 3]) # 列表转数组 np.array([(1, 2), (3, 4)], dtype=float) # 指定类型 # 内置创建函数 np.zeros((3, 4)) # 3×4零矩阵 np.ones((2, 3, 4)) # 2×3×4全1数组(三维) np.eye(3) # 3×3单位矩阵 np.full((2, 2), 7) # 填充特定值 # 序列生成 np.arange(0, 10, 2) # [0, 2, 4, 6, 8],步长为2 np.linspace(0, 1, 5) # [0, 0.25, 0.5, 0.75, 1],5个等间距点 # 随机数组 np.random.rand(3, 3) # 0-1均匀分布 np.random.randn(3, 3) # 标准正态分布 np.random.randint(1, 10, (3,3)) # 随机整数 np.random.seed(42) # 设置随机种子保证可复现1.3数据类型(dtype)
# 常见类型 np.array([1, 2, 3], dtype=np.int32) # 32位整数 np.array([1.0, 2.0], dtype=np.float64) # 64位浮点(默认) np.array([True, False], dtype=np.bool_) # 布尔型 # 类型转换 arr.astype(np.float32) # 转换数据类型1.4 索引与切片
arr = np.arange(10).reshape(2, 5) # 2×5数组 # 基础索引 arr[0, 1] # 0行1列元素:1 arr[0][1] # 同上(但不建议,效率较低) # 切片(重要:切片是视图view,非副本) arr[:, 1:3] # 所有行,1-2列 arr[::-1] # 行逆序 # 布尔索引(筛选) arr[arr > 5] # 所有大于5的元素(一维结果) arr[(arr > 2) & (arr < 8)] # 多条件(&|, ~分别代表与或非) # 花式索引(整数数组索引) arr[[0, 1], [2, 3]] # 取(0,2)和(1,3)元素 → [2, 8] arr[:, [0, 2, 4]] # 取第0,2,4列 # 获取副本(避免修改原数组) arr[0:2, 0:2].copy()1.5 数组运算与广播
向量化运算是NumPy的核心优势:
a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) # 元素级运算 a + b # [5, 7, 9] a * b # [4, 10, 18](逐元素乘,非矩阵乘) a ** 2 # [1, 4, 9] np.sqrt(a) # 开方 # 矩阵乘法 A = np.array([[1, 2], [3, 4]]) B = np.array([[5, 6], [7, 8]]) A @ B # 或 np.dot(A, B),矩阵乘法 # 广播机制(Broadcasting) # 标量广播 a + 10 # [11, 12, 13] # 维度广播(自动扩展较小数组) matrix = np.ones((3, 3)) vector = np.arange(3) # [0, 1, 2] matrix + vector # 每行加vector,结果为[[1,2,3], [1,2,3], [1,2,3]] # 广播规则:从后向前比较维度,相等或其中一个为1时可广播1.6 常用数学与统计函数
arr = np.random.randn(4, 5) # 基础统计 arr.sum() # 总和 arr.mean() # 均值 arr.std() # 标准差 arr.var() # 方差 arr.min() # 最小值 arr.max() # 最大值 arr.argmin() # 最小值索引(扁平化后) arr.argmax() # 最大值索引 # 轴参数(axis)关键概念 arr.sum(axis=0) # 按列求和(压缩行,结果形状(5,)) arr.sum(axis=1) # 按行求和(压缩列,结果形状(4,)) arr.mean(axis=0, keepdims=True) # 保持维度,结果形状(1,5) # 其他数学函数 np.exp(arr) # 指数 np.log(arr) # 自然对数 np.sin(arr) # 三角函数 np.ceil(arr) # 向上取整 np.floor(arr) # 向下取整 np.clip(arr, -1, 1) # 限制在[-1,1]区间1.7 数组形状操作
arr = np.arange(12) # [0..11] # 重塑(reshape,返回视图或副本) arr.reshape(3, 4) # 3×4数组 arr.reshape(3, -1) # -1自动计算该维度大小 arr.reshape(2, 2, 3) # 三维数组 # 转置与换轴 arr.T # 转置(二维) arr.transpose(1, 0, 2) # 指定轴顺序 arr.swapaxes(0, 1) # 交换两个轴 # 扁平化 arr.flatten() # 返回副本(一维) arr.ravel() # 返回视图(高效,修改会影响原数组) # 增删维度 arr[np.newaxis, :] # 增加轴,形状(1, 12) arr[:, np.newaxis] # 形状(12, 1) np.squeeze(arr) # 移除长度为1的轴1.8 数组合并与分割
a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6]]) # 合并 np.vstack((a, b)) # 垂直堆叠(行增加) np.hstack((a, b.T)) # 水平堆叠(列增加) np.concatenate([a, b], axis=0) # 指定轴连接 np.stack([a, a], axis=0) # 在新轴上堆叠,结果(2,2,2) # 分割 np.split(arr, 3, axis=0) # 等分为3份 np.array_split(arr, 3) # 不等分(更常用) np.hsplit(arr, 2) # 水平分割 np.vsplit(arr, 2) # 垂直分割1.9 线性代数(np.linalg)
A = np.array([[3, 1], [1, 2]]) b = np.array([9, 8]) # 核心运算 np.linalg.inv(A) # 逆矩阵 np.linalg.det(A) # 行列式 np.linalg.matrix_rank(A) # 矩阵秩 np.linalg.solve(A, b) # 解线性方程组 Ax = b # 分解与特征 eigenvalues, eigenvectors = np.linalg.eig(A) # 特征值与特征向量 U, S, Vh = np.linalg.svd(A) # 奇异值分解 # 范数 np.linalg.norm(A) # Frobenius范数 np.linalg.norm(A, ord=2) # 谱范数(最大奇异值)1.10 实用技巧与最佳实践
# 1. 预分配内存(避免动态扩展) result = np.empty((1000, 1000)) for i in range(1000): result[i] = some_computation() # 2. 布尔掩码赋值 arr[arr < 0] = 0 # 将所有负数置零(clip的替代) # 3. 结构化数组(类似数据库记录) dt = np.dtype([('name', 'U10'), ('age', 'i4'), ('score', 'f4')]) students = np.array([('Alice', 20, 85.5), ('Bob', 21, 92.0)], dtype=dt) students['name'] # 访问字段 # 4. 内存布局 arr = np.array([[1, 2], [3, 4]], order='C') # C风格(行优先,默认) arr = np.array([[1, 2], [3, 4]], order='F') # Fortran风格(列优先) # 5. 视图vs副本 view = arr[::2] # 步长切片,总是视图 copy = arr[::2].copy() # 显式复制 # 6. 性能优化:避免Python循环,使用向量化 # 慢 result = [np.sin(x) for x in arr] # 快 result = np.sin(arr)1.11 实用建议
忘掉循环,拥抱向量化:养成直接用数组运算思考的习惯,这是用好 NumPy 的关键。
理解维度:时刻清楚你的
arr.shape,这是进行复杂操作和广播的基础。关注数据类型:创建数组时,用
dtype参数(如np.float32)可节省大量内存。作为基石:NumPy 数组是 Pandas(数据分析)、Scikit-learn(机器学习)等所有主流数据科学库的底层数据结构。
import pandas as pd df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD')) values = df.values # 转为NumPy数组(视图或副本视情况而定)