跳到主要内容

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 常用语法和函数速查

版本说明

本教程基于 NumPy 2.0+ 编写,涵盖了最新版本的主要特性和改进。NumPy 2.0 是一个重要的里程碑版本,带来了新的数据类型、更快的性能和改进的API。

NumPy 2.0 新特性概述

NumPy 2.0 是自 2006 年以来的首个主要版本,包含大量重要更新:

性能提升

  • 排序加速sortargsortpartitionargpartition 函数通过 Intel x86-simd-sort 和 Google Highway 库加速,性能提升显著
  • macOS Accelerate 支持:在 macOS 13.3+ 上,线性代数运算性能提升高达 10 倍
  • 字符串操作优化numpy.char 固定长度字符串操作已加速

新功能

  • StringDType:新的可变长度字符串数据类型,支持更高效的字符串处理
  • bitwise_count:新函数,计算整数中 1 位的数量
  • float32 和 longdouble 支持:所有 numpy.fft 函数现在支持这些类型
  • quantile 权重支持quantilepercentile 函数现在支持 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.longfloatnp.longdouble
np.string_np.bytes_
np.unicode_np.str_
np.Infnp.inf
np.NaNnp.nan
np.matnp.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 学习之旅!