NumPy 教程
欢迎学习 NumPy!本教程将带你从零基础开始,全面掌握 NumPy 的核心知识和技能。
什么是 NumPy?
NumPy(Numerical Python)是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy 是 Python 数据科学生态系统的核心,几乎所有科学计算库都依赖于 NumPy。
核心特性
NumPy 之所以成为 Python 科学计算的基石,主要归功于以下几个核心特性:
高性能的多维数组对象(ndarray):NumPy 提供了 ndarray 对象,这是一种高效存储和操作大型数组的数据结构。与 Python 原生的列表相比,ndarray 在存储效率和运算速度上有显著优势。
向量化运算能力:NumPy 支持向量化和广播机制,这意味着你可以对整个数组执行数学运算,而无需编写显式的循环语句。这种设计不仅使代码更加简洁,还能充分利用底层优化实现高性能计算。
丰富的数学函数库:NumPy 提供了大量用于数组运算的数学函数,包括基础的算术运算、三角函数、指数对数函数、统计函数等,满足各种科学计算需求。
与其他工具的无缝集成:NumPy 是整个 Python 科学计算生态系统的核心,可以与 Pandas(数据分析)、SciPy(科学计算)、Matplotlib(数据可视化)、Scikit-learn(机器学习)、TensorFlow 和 PyTorch(深度学习)等库完美配合工作。
为什么学习 NumPy?
1. 数据科学的必备基础
无论你从事数据分析、机器学习还是深度学习,NumPy 都是必须掌握的基础技能。很多高级库的核心数据结构都是基于 NumPy 数组构建的,理解 NumPy 能帮助你更好地理解和使用这些工具。
2. 性能优势明显
NumPy 的底层实现使用 C 语言编写,计算效率远高于纯 Python 代码。对于大型数组的数值运算,NumPy 的速度可以达到纯 Python 代码的几十甚至几百倍。
3. 代码更加简洁
借助向量化和广播机制,你可以用简洁的代码完成复杂的数学运算。例如,计算两个数组对应元素的和,只需使用 a + b 即可,无需编写循环。
NumPy 的应用场景
NumPy 的应用范围非常广泛,涵盖了科学计算的各个方面:
数值计算:进行大规模数值运算、矩阵运算、线性代数操作等。
图像处理:将图像表示为多维数组,进行像素级操作、滤镜应用、图像变换等。
信号处理:进行傅里叶变换、滤波器设计、频谱分析等。
统计分析:计算均值、方差、相关系数等统计指标。
机器学习:作为 TensorFlow、PyTorch、Scikit-learn 等机器学习框架的基础数据结构。
教程内容结构
本教程分为以下几个阶段:
第一部分:入门基础
第二部分:核心功能
第三部分:进阶主题
- 广播机制 - 深入理解 NumPy 广播规则与应用
- 线性代数 - 矩阵运算、分解与线性方程组求解
- 排序与搜索 - 数组排序、查找与集合操作
- 副本与视图 - 内存管理与数据共享原理
- 随机数生成 - Generator API、概率分布与随机采样
第四部分:专项功能
- 傅里叶变换 - FFT 原理、频谱分析与信号处理应用
- 掩码数组 - 缺失值处理与无效数据屏蔽
- 字符串操作 - 字符串数组的向量化处理
- 多项式 - 多项式运算、拟合与正交多项式
- 结构化数组 - 表格数据处理与记录数组
知识速查
- 速查表 - NumPy 常用语法和函数速查
版本说明
本教程基于 NumPy 2.0+ 编写,涵盖了最新版本的主要特性和改进。NumPy 2.0 是一个重要的里程碑版本,带来了新的数据类型、更快的性能和改进的API。
NumPy 2.0 新特性概述
NumPy 2.0 是自 2006 年以来的首个主要版本,包含大量重要更新:
性能提升
- 排序加速:
sort、argsort、partition、argpartition函数通过 Intel x86-simd-sort 和 Google Highway 库加速,性能提升显著 - macOS Accelerate 支持:在 macOS 13.3+ 上,线性代数运算性能提升高达 10 倍
- 字符串操作优化:
numpy.char固定长度字符串操作已加速
新功能
- StringDType:新的可变长度字符串数据类型,支持更高效的字符串处理
- bitwise_count:新函数,计算整数中 1 位的数量
- float32 和 longdouble 支持:所有
numpy.fft函数现在支持这些类型 - quantile 权重支持:
quantile和percentile函数现在支持weights参数
API 改进
- 更清晰的公共 API:每个公共函数现在只在单一位置可用
- 规范化的 dtype 名称:统一的类型名称命名
- 维度限制提升:数组最大维度从 32 提升到 64
重要行为变更
- Windows 整数类型:Windows 上默认整数类型现在是
int64(与其他平台一致) - 类型提升规则:采用 NEP 50,修复了之前依赖数据值而非仅依赖 dtype 的类型提升问题
从 NumPy 1.x 迁移指南
如果你从 NumPy 1.x 升级,请注意以下重要变更:
已移除的类型别名
以下别名在 NumPy 2.0 中已移除,请使用替代方案:
| 已移除 | 替代方案 |
|---|---|
np.float_ | np.float64 |
np.complex_ | np.complex128 |
np.longfloat | np.longdouble |
np.string_ | np.bytes_ |
np.unicode_ | np.str_ |
np.Inf | np.inf |
np.NaN | np.nan |
np.mat | np.asmatrix |
已移除的函数
# 不再使用
np.round_() # 使用 np.round()
np.trapz() # 使用 np.trapezoid()
np.in1d() # 使用 np.isin()
np.row_stack() # 使用 np.vstack()
# 错误处理方式改变
# 不再使用 np.geterrobj() 和 np.seterrobj()
# 使用上下文管理器
with np.errstate(divide='ignore'):
result = np.array([1]) / 0
类型提升变化
NumPy 2.0 的类型提升规则更加一致:
# NumPy 1.x 行为(依赖于数据值)
np.array([1]) + np.array([1.0]) # float64
np.array([1]) + np.array([1.0, 2.0]) # 可能不同
# NumPy 2.0 行为(仅依赖 dtype)
np.array([1]) + np.array([1.0]) # float64(一致)
np.array([1]) + np.array([1.0, 2.0]) # float64(一致)
更多迁移资源
学习建议
1. 理解向量化思维
NumPy 的核心思想是向量化计算。尝试用数组操作替代循环,这不仅能让代码更简洁,还能获得更好的性能。
2. 重视广播机制
广播是 NumPy 非常重要的特性,理解它能帮助你处理形状不同的数组之间的运算。
3. 多做练习
NumPy 的学习需要大量的实践。建议每学一个知识点,都动手编写代码验证。
4. 查阅文档
NumPy 的官方文档非常详尽,遇到问题时优先查阅官方文档。
参考资源
官方资源
学习资源
准备好了吗?点击下一章开始你的 NumPy 学习之旅!