NumPyNumericalPython是Python的一种开源科学计算库由Travis Oliphant基于Numeric和Numarray库改进开发2005年正式发布采用BSD许可证。其前身Numeric最早可追溯至1995年。该库以ndarray对象为核心支持多维数组与矩阵运算提供数学函数库 线性代数及傅里叶变换等功能其数组运算性能相比Python原生列表有显著提升。广泛应用于金融分析 科学计算等领域1.numpy 支持的数据类型数据类型NumPy 类型取值范围对应2的幂次字节大小典型用途布尔型bool_True / False-1逻辑判断 掩码数组8位有符号整数int8-128 到 127-2⁷ 到 2⁷ - 11节省空间的整数存储8位无符号整数uint80 到 2550 到 2⁸ - 11图像像素值如RGB16位有符号整数int16-32,768 到 32,767-2¹⁵ 到 2¹⁵ - 12音频信号 中等范围整数16位无符号整数uint160 到 65,5350 到 2¹⁶ - 12深度图像 传感器数据‌32位有符号整数‌‌int32‌‌-2,147,483,648 到 2,147,483,647‌‌-2³¹ 到 2³¹ - 1‌‌4‌‌通用计算 索引 Java兼容‌32位无符号整数uint320 到 4,294,967,2950 到 2³² - 14大整数计数 哈希值64位有符号整数int64-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807-2⁶³ 到 2⁶³ - 18大数据索引 时间戳64位无符号整数uint640 到 18,446,744,073,709,551,6150 到 2⁶⁴ - 18唯一ID 大数运算单精度浮点float32约 ±1.18×10⁻³⁸ 到 ±3.4×10³⁸IEEE 754 单精度4深度学习 GPU计算双精度浮点float64约 ±2.23×10⁻³⁰⁸ 到 ±1.80×10³⁰⁸IEEE 754 双精度8科学计算默认类型单精度复数complex64实部与虚部均为 float32-8信号处理 嵌入式应用双精度复数complex128实部与虚部均为 float64-16高精度复数运算Unicode字符串str_ / unicode_可变长度-可变文本数据日期时间datetime64纳秒级时间戳约 ±292年-8时间序列分析时间间隔timedelta64时间差纳秒级-8时间差计算对象引用object_任意Python对象-8混合类型数组性能较低无类型二进制void原始字节流-可变结构化数据 内存映射1.1 IEEE 754IEEE 754 是由电气与电子工程师协会IEEE在1985年制定的浮点数运算标准旨在统一计算机系统中浮点数的表示和计算方法。该标准广泛应用于现代计算机的 CPU 和浮点运算单元中确保不同平台之间的浮点运算结果一致。IEEE 754 标准定义了浮点数的三种基本组成部分符号位sign bit 指数位exponent和尾数位mantissa 或 fraction。对于常见的单精度32 位和双精度64 位浮点数其结构如下‌单精度浮点数float‌符号位1 位指数位8 位尾数位23 位‌双精度浮点数double‌符号位1 位指数位11 位尾数位52 位浮点数的表示形式为 (-1)^S × (1M) × 2^E 其中S 是符号位0 表示正数1 表示负数M 表示有效数字尾数位范围1M2E 是指数部分采用偏移量表示法对于8位的E单精度偏移量为 127对于11位的E双精度为 1023IEEE 754 还定义了多种特殊值例如‌无穷大Infinity‌当指数位全为 1尾数位全为 0 时表示正无穷或负无穷‌非数值NaN‌当指数位全为 1尾数位非零时表示无效或未定义的结果‌非规格化数Denormal Numbers‌用于表示非常接近零的数以提高精度1.2 复数复数Complex Number是数学中的一种数表示为zaib。‌代数表示法‌复数的标准形式为 z a bi其中 a 为实部b 为虚部。‌几何意义‌复数可以在复平面上表示为点 (a, b)也可以看作从原点出发指向该点的向量。其模长度为 √(a² b²)辐角与实轴正方向的夹角为 arctan(b/a)。‌复数运算的几何意义加法对应向量的首尾相连乘法涉及旋转和缩放减法则表示两个向量之间的差。2.numAPI详解import numpy as np2.1 创建列表2.1.1 全 0 / 全 1 / 空数组--- ## 一 数组创建创建ndarray ### 1. 从列表/元组创建 python # 1维数组 arr1 np.array([1, 2, 3, 4]) # 2维数组 arr2 np.array([[1, 2], [3, 4]]) # 2行3列 全0 np.zeros((2, 3)) # 3行2列 全1 np.ones((3, 2)) # 空数组值随机 np.empty((2, 2))2.1.2 固定值数组# 2x2 数组所有值为 5 np.full((2, 2), 5)2.1.3 等差 / 等距数组# 0到9不包含10 np.arange(0, 10, 2) # 输出[0 2 4 6 8] # 0到1 均匀分成5个数 np.linspace(0, 1, 5)2.1.4 单位矩阵np.eye(3) # 3x3单位矩阵2.1.5 随机数组# 0~1 随机数2x2 np.random.rand(2, 2) # 标准正态分布 np.random.randn(2, 2) # 整数随机数组0~92x3 np.random.randint(0, 10, (2, 3))2.2 数组属性查看数组信息arr np.array([[1,2,3], [4,5,6]]) ​ arr.ndim # 维度数 → 2 arr.shape # 形状 → (2,3) arr.size # 总元素数 → 6 arr.dtype # 数据类型 → int64 arr.T # 数组转置2.3 数组重塑与变形2.3.1 reshape重塑形状arr np.arange(6) # 1维→2行3列 arr.reshape(2, 3) ​ a np.array([[1,2],[3,4]]) # 展平成一维 b a.reshape(4) c a.reshape(-1) # 常用写法 ​ a np.arange(12) # (12,) → (2, 6) a.reshape(2, -1) ​ # (12,) → (6, 2) a.reshape(-1, 2) ​ # (12,) → (3,2,2) a.reshape(3, 2, -1) ​ # 4维batch, channel, H, W img np.random.rand(8, 3, 32, 32) ​ # 展平成 (8, 3*32*32) flatten img.reshape(8, -1) ​ # 变回 4D back flatten.reshape(8, 3, 32, 32)2.3.2 flatten/ravel展平数组arr np.array([[1,2],[3,4]]) arr.flatten() # [1 2 3 4]返回副本 arr.ravel() # [1 2 3 4]返回视图2.4 索引与切片取值 / 修改2.4.1 基础索引arr np.array([[1,2,3], [4,5,6]]) arr[0, 1] # 第0行第1列 → 2 arr[1] # 第1行 → [4 5 6] arr[:, 0] # 第0列 → [1 4]2.4.2 布尔索引arr np.array([1,2,3,4,5]) arr[arr 3] # 大于3的元素 → [4 5]2.4.3 花式索引arr np.array([10,20,30,40]) arr[[0,2,3]] # [10 30 40]2.5 数学运算逐元素2.5.1 基础运算a np.array([1,2,3]) b np.array([4,5,6]) a b # 加法 a - b # 减法 a * b # 乘法 a / b # 除法 a ** 2 # 平方2.5.2 通用数学函数arr np.array([1,2,3]) np.sqrt(arr) # 平方根 np.exp(arr) # 指数 np.log(arr) # 自然对数 np.sin(arr) # 正弦 np.abs(arr) # 绝对值2.6 统计运算arr np.array([[1,2,3], [4,5,6]]) arr.sum() # 总和 → 21 arr.sum(axis0) # 按列求和 → [5 7 9] arr.sum(axis1) # 按行求和 → [6 15] arr.mean() # 平均值 arr.max() # 最大值 arr.min() # 最小值 np.median(arr) # 中位数 arr.std() # 标准差 arr.var() # 方差2.7 数组拼接与拆分2.7.1 拼接a np.array([[1,2], [3,4]]) b np.array([[5,6], [7,8]]) np.hstack((a, b)) # 水平拼接 np.vstack((a, b)) # 垂直拼接 np.concatenate((a, b), axis0) # 垂直 np.concatenate((a, b), axis1) # 水平2.7.2 拆分arr np.arange(9).reshape(3,3) np.split(arr, 3, axis0) # 垂直拆3份2.8 矩阵运算线性代数a np.array([[1,2], [3,4]]) b np.array([[5,6], [7,8]]) # 矩阵乘法 np.dot(a, b) a b # 逆矩阵 np.linalg.inv(a) # 行列式 np.linalg.det(a) # 特征值 np.linalg.eig(a)2.9 条件与替换arr np.array([1, -2, 3, -4]) # 小于0替换为0否则保留原值 np.where(arr 0, 0, arr) # [1 0 3 0]2.10 去重与排序arr np.array([3,1,2,2,3]) np.unique(arr) # 去重 → [1 2 3] arr.sort() # 排序 → [1 2 2 3 3]2.11 数据类型转换arr np.array([1.1, 2.2, 3.3]) arr.astype(int) # 转整型 → [1 2 3]2.12 文件读写arr np.array([1,2,3]) # 保存 np.save(arr.npy, arr) # 加载 np.load(arr.npy)3 张量Tensor基础3.1 什么是张量标量0 维张量一个数向量1 维张量数组矩阵2 维张量3 维及以上都叫张量NumPy 的ndarray 张量的底层实现。3.2 张量维度 / 形状查看# 0维标量 s np.array(5) print(s.ndim, s.shape) # 0 () # 1维向量 v np.array([1,2,3]) print(v.ndim, v.shape) # 1 (3,) # 2维矩阵 m np.array([[1,2],[3,4]]) print(m.ndim, m.shape) # 2 (2,2) # 3维张量常用图片、序列 t np.random.rand(2, 3, 4) # 2个3行4列的矩阵 print(t.ndim, t.shape) # 3 (2,3,4)4 张量核心操作高频 APIreshape重塑形状expand_dims增加维度squeeze压缩空维度transpose交换维度concatenate / stack拼接4.1 重塑形状 reshape最常用改变维度不改变数据arr np.arange(12) # 1D: (12,) # 转为 3D 张量 (2,2,3) t arr.reshape(2, 2, 3) print(t.shape) # (2,2,3)4.2 增加维度 expand_dims常用于给数据加通道 / 批次维度a np.array([1,2,3]) # (3,) # 在 0 维度增加 a1 np.expand_dims(a, axis0) # (1,3) # 在 1 维度增加 a2 np.expand_dims(a, axis1) # (3,1)4.3 压缩维度 squeeze删除大小为 1 的维度a np.array([[[1,2,3]]]) # (1,1,3) b a.squeeze() # (3,)4.4 转置 transpose / T高维张量交换维度# 3维张量 (2,3,4) t np.random.rand(2,3,4) # 交换维度 0 和 2 t2 t.transpose(2,1,0) print(t2.shape) # (4,3,2) # 2维矩阵转置 m np.array([[1,2],[3,4]]) print(m.T)4.5 拼接 concat /stackconcatenate在现有维度拼接stack新建维度拼接a np.random.rand(2,3) b np.random.rand(2,3) # 垂直拼接行增加shape(4,3) c1 np.concatenate([a,b], axis0) # 水平拼接列增加shape(2,6) c2 np.concatenate([a,b], axis1) # stack 新维度 shape(2,2,3) s np.stack([a,b], axis0)4.6 拆分 splitarr np.random.rand(6,3) a1,a2,a3 np.split(arr, 3, axis0) # 垂直拆3份4.7 维度重复 repeat /tilea np.array([[1,2]]) # (1,2) # 重复 3 次shape(3,2) r a.repeat(3, axis0)5 广播机制Broadcasting5.1 什么是广播不同形状的张量自动扩展维度后进行运算不用循环不用手动复制自动对齐。自动扩展不同形状的张量进行运算规则从后向前对齐维度相等或为 1好处速度快、代码简洁、无需循环5.2 广播规则简单记从最后一维向前对齐维度相等其中一个维度为 1满足即可广播。5.3 广播示例最经典示例 1标量 张量自动广播a np.array([[1,2],[3,4]]) b 2 print(a b) # 自动把 2 扩展成和 a 一样形状再计算示例 2(3,) (3,1) → 可广播a np.array([1,2,3]) # (3,) b np.array([[1], [2], [3]]) # (3,1) print(a b) # 结果形状 (3,3)示例 3(2,3) (1,3) → 可广播a np.ones((2,3)) b np.ones((1,3)) print(a b) # 自动把 b 复制成 (2,3)示例 4(2,1) (1,3) → 广播成 (2,3)a np.array([[1],[2]]) # (2,1) b np.array([[1,2,3]]) # (1,3) print(a b) # 输出 (2,3)5.4 不能广播的情况a np.ones((2,3)) b np.ones((2,4)) # 最后一维 3 vs 4 → 不匹配 → 报错5.5 广播用途实战数据归一化批量数据 偏置项神经网络前向传播图片通道加减均值5.6 张量 广播 综合小案例# 1. 创建 4D 张量模拟批量图片批次8通道3高32宽32 imgs np.random.rand(8, 3, 32, 32) # 2. 创建均值通道维度3 mean np.array([0.485, 0.456, 0.406]) # (3,) # 3. 调整均值形状适配广播 mean mean.reshape(1, 3, 1, 1) # (1,3,1,1) # 4. 广播减法自动扩展到 8,3,32,32 imgs_norm imgs - mean print(imgs_norm.shape) # (8, 3, 32, 32)