Python 科学计算一:NumPy—— 数组运算与数值计算基石

📅 2026/8/4 9:39:59
Python 科学计算一:NumPy—— 数组运算与数值计算基石
Python 科学计算一NumPy—— 数组运算与数值计算基石9.1 本章导学原生 Python 的列表虽然灵活但在大规模数值计算上存在致命缺陷运算速度慢、内存占用高、不支持批量矩阵运算。而深度学习、大模型的本质就是海量的张量数值运算原生 Python 完全无法满足性能需求。NumPy 是 Python 科学计算的基础库它提供了多维数组对象 ndarray 以及配套的数组运算函数底层由 C 语言实现运算效率比原生 Python 高两个数量级以上。所有更高阶的 AI 库包括 PyTorch、TensorFlow、Pandas、Scikit-learn全部构建在 NumPy 的思想与接口体系之上。学好 NumPy 有两个核心价值 第一工程基础。数据预处理、特征工程、结果分析都离不开 NumPy是 AI 开发的必备工具。 第二理论衔接。NumPy 的数组、维度、广播、矩阵运算等概念和深度学习中的张量完全对应。吃透 NumPy 的运算逻辑后续学习 PyTorch 张量操作会非常平滑本质只是换一套 API思想完全一致。本章系统讲解 NumPy 核心体系从数组创建、索引切片、运算规则、广播机制到维度变换所有知识点都会对应深度学习中的真实场景例如矩阵乘法对应全连接层、广播对应偏置相加、轴运算对应归一化统计。9.2 ndarrayNumPy 的核心数组对象9.2.1 为什么 ndarray 远快于 Python 列表第一连续内存存储。Python 列表存储的是对象指针元素分散在内存各处ndarray 的所有元素在内存中连续排列CPU 缓存命中率极高读写速度更快。 第二向量化运算。ndarray 支持逐元素批量运算无需编写 Python 循环底层由 C 语言执行避免了 Python 解释器的开销。 第三同类型数据。ndarray 所有元素类型一致无需动态类型检查存储密度更高运算更高效。在大规模数值计算场景下NumPy 的运算速度通常是原生 Python 循环的几十到上百倍。大模型的底层运算量极大这种性能差异是决定性的。9.2.2 数组的核心属性每个 ndarray 数组都有四个核心属性对应深度学习中张量的核心概念 第一ndim。数组的维度数也就是轴的数量标量是 0 维、向量是 1 维、矩阵是 2 维、批量特征是 3 维对应张量的阶数。 第二shape。数组的形状是一个元组描述每个维度的长度。例如批次大小、序列长度、隐藏维度组成的三元组这是 AI 开发中最常操作的属性。 第三dtype。数组元素的数据类型常用 float32、float64、int32、int64对应深度学习中的精度类型。 第四size。数组元素总个数等于 shape 各维度乘积。例如形状为 (8, 512, 768) 的数组完全对应 Transformer 中一个批次的特征张量理解了 shape 的含义就理解了张量的维度结构。9.3 数组的创建方式9.3.1 从 Python 序列创建使用 np.array () 可以将列表、元组转换为 ndarray支持创建一维向量和二维矩阵。9.3.2 特殊数组创建AI 开发中常用的快速创建函数包括 np.zeros 生成全 0 数组常用于初始化偏置、掩码np.ones 生成全 1 数组常用于初始化权重掩码np.full 生成指定填充值的数组np.eye 生成 n 阶单位矩阵。9.3.3 序列数组np.arange 生成等差序列类似 Python 的 range常用于生成索引序列np.linspace 生成指定数量的均匀间隔序列常用于生成坐标、采样点。9.3.4 随机数组随机数组在 AI 中应用极广权重初始化、数据打乱、随机采样都依赖随机数。np.random.randn 生成标准正态分布随机数是最常用的权重初始化方式np.random.rand 生成 0 到 1 均匀分布的随机数np.random.randint 生成指定范围的随机整数。设置随机种子可以保证随机结果可复现这是实验可重复性的基础。大模型实验中固定随机种子是标准操作确保每次运行结果一致便于排查问题。9.4 索引与切片NumPy 的索引切片语法和 Python 列表类似但功能更强大支持多维度同时索引。掌握索引操作是处理张量数据的基础。9.4.1 基础索引与切片多维数组用逗号分隔不同维度的索引可以灵活访问单个样本、部分序列、部分特征维度。切片规则和 Python 一致start:end:step省略 start 默认从 0 开始省略 end 默认到末尾。9.4.2 布尔索引通过布尔数组筛选元素是数据过滤的常用手段。例如筛选出长度符合要求的样本、掩码掉无效位置。布尔索引在注意力掩码、序列填充中是核心操作和 Transformer 中的 Padding Mask 原理完全一致。9.4.3 花式索引通过整数数组一次性索引多个位置用于按指定顺序取数据、重排样本。9.5 数组运算9.5.1 逐元素运算NumPy 的算术运算符默认都是逐元素运算两个形状相同的数组对应位置的元素分别计算。支持加减乘除、幂运算、比较运算以及大量数学函数所有运算都是向量化执行速度极快。逐元素运算对应深度学习中的逐元素操作例如激活函数、残差相加都是逐元素运算。9.5.2 矩阵乘法与向量内积矩阵乘法是神经网络的核心运算全连接层、注意力打分本质都是矩阵乘法。需要特别注意区分* 是逐元素相乘要求形状完全一致或 matmul 是矩阵乘法要求前一个矩阵的列数等于后一个矩阵的行数。向量内积是矩阵乘法的特例两个一维向量做点积得到标量。自注意力机制中 Query 和 Key 的打分计算本质就是向量点积。9.6 广播机制 Broadcasting9.6.1 广播的意义如果每次运算都要求数组形状完全一致会非常繁琐。例如给一个批次的所有特征都加上同一个偏置向量没必要把偏置复制成和特征一样的形状。广播机制允许不同形状的数组进行运算自动扩展维度既节省内存又提升代码简洁度。深度学习中大量运算都依赖广播偏置相加、归一化减去均值、掩码加权底层都是广播机制。9.6.2 广播规则两个数组运算时从最右侧的维度开始向左逐一匹配如果维度大小相等直接运算如果其中一个维度大小为 1自动扩展为和另一个数组相同的大小如果维度数量不同少的一侧自动补维度再匹配。理解广播规则就能看懂绝大多数维度不匹配的报错也能写出更简洁高效的代码。9.7 统计运算与轴的概念9.7.1 轴的本质多维数组的每个维度都对应一个轴轴的编号从 0 开始从左到右递增。统计函数可以指定在哪个轴上进行运算运算后该轴会被压缩消失。这是 NumPy 最抽象也最重要的概念。很多初学者维度运算混乱根源就是没理解轴的含义。例如形状为 (8, 512, 768) 的数组axis0 是样本维度axis1 是序列长度维度axis2 是特征维度。如果在 axis0 上求均值就是对 8 个样本取平均得到的结果形状是 (512, 768)第 0 维消失。9.7.2 常用统计函数所有统计函数都支持 axis 参数不指定则对全部元素统计。常用函数包括求和、均值、标准差、方差、最大值、最小值以及最大值最小值对应的索引。keepdims 参数非常重要保留被压缩的维度且大小为 1后续可以直接广播运算避免维度不匹配问题。层归一化的核心逻辑就是在特征维度上求均值和标准差再做归一化这也是 Transformer 中标准的归一化操作。9.8 数组变形操作数组维度变换是 AI 开发中最高频的操作之一张量的形状调整全部依赖这类函数。9.8.1 reshape改变形状reshape 可以在不改变元素总数的前提下重新排列数组的维度形状。可以用 - 1 表示自动计算该维度的大小非常方便。9.8.2 转置与维度交换.T 用于二维数组转置交换两个维度np.transpose 按指定顺序重排所有维度np.swapaxes 交换指定的两个维度。在处理图像、序列数据时维度顺序变换非常常见。9.8.3 维度增删np.expand_dims 在指定位置增加一个大小为 1 的维度np.squeeze 删除指定的大小为 1 的维度。增加维度通常是为了满足广播要求或者适配框架的输入维度格式。9.8.4 数组拼接与分割np.concatenate 在指定轴上拼接多个数组数组其他维度大小必须一致np.split 沿指定轴分割数组。拼接常用于合并多个批次数据、拼接不同特征是数据处理的常用操作。9.9 实战用 NumPy 实现单层神经网络前向传播结合本章知识可以从零实现一个全连接层加 ReLU 激活的前向传播直观感受矩阵运算如何构成神经网络。核心逻辑包括定义全连接层函数实现矩阵乘法加偏置的运算定义 ReLU 激活函数实现逐元素的非线性变换构造输入、权重和偏置执行前向传播并验证输出形状。这段代码就是神经网络全连接层的完整数学实现和 PyTorch 的 nn.Linear 底层逻辑完全一致。理解了这个实现就理解了深度学习线性层的本质就是矩阵乘法加偏置广播加激活函数。9.10 本章小结本章系统搭建了 NumPy 科学计算的知识体系所有知识点都和深度学习张量运算一一对应。核心知识点包括ndarray 是 NumPy 核心连续内存加向量化运算带来极致性能shape、dtype、ndim 是数组的核心属性对应张量的形状、精度、阶数索引切片、布尔索引、花式索引是数据处理的基础操作逐元素运算、矩阵乘法是神经网络的核心运算形式广播机制让不同形状数组可以高效运算是偏置、归一化的基础轴的概念是理解高维统计运算的关键所有归一化、均值统计都依赖轴操作维度变形、拼接分割是张量操作的高频技能。课后可以完成四项实践任务创建一个形状为 (16, 32, 64) 的随机数组模拟批次数据在最后一维做 softmax 归一化实现两个矩阵的逐元素乘积与矩阵乘法对比结果区别用 NumPy 实现一个两层的全连接网络包含 ReLU 激活。