文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。
什么是 NumPy?
什么是 NumPy?
NumPy 是 Python 科学计算的基础包。它是一个提供多维数组对象的 Python 库,以及多种派生对象(如掩码数组和矩阵),并包含用于数组快速操作的各类例程,涵盖数学运算、逻辑运算、形状操作、排序、选择、I/O、离散傅里叶变换、基础线性代数、基础统计运算、随机模拟等功能。
NumPy 包的核心是 ndarray
对象。该对象封装了_同构数据类型的 n 维数组_,许多操作在编译代码中执行以提升性能。NumPy 数组与标准 Python 序列存在以下重要区别:
-
固定大小:NumPy 数组在创建时具有固定大小(与可动态扩展的 Python 列表不同)。修改
ndarray
的大小将创建新数组并删除原数组。 -
同构数据类型:NumPy 数组中的所有元素必须具有相同数据类型(因此内存中占用相同空间)。例外情况:可以创建包含(Python 或 NumPy)对象的数组,此时允许存在不同大小的元素。
-
高效操作:NumPy 数组便于对大量数据执行高级数学运算和其他类型操作。相较于使用 Python 内置序列,这些操作通常执行效率更高且代码量更少。
-
广泛兼容性:越来越多的科学计算和数学类 Python 包使用 NumPy 数组。尽管这些包通常支持 Python 序列输入,但它们会在处理前将输入转换为 NumPy 数组,并经常输出 NumPy 数组。换言之,要高效使用当今大多数基于 Python 的科学/数学软件,仅了解 Python 内置序列类型是不够的——还需掌握 NumPy 数组的使用方法。
关于序列大小和速度的要点在科学计算中尤为重要。举个简单例子:假设需要将一维序列中的每个元素与另一等长序列的对应元素相乘。若数据存储在 Python 列表 a
和 b
中,可通过迭代实现:
c = []
for i in range(len(a)):
c.append(a[i]*b[i])
此方法能得到正确结果,但如果 a
和 b
各包含数百万个数字,Python 循环的低效性将带来显著性能损耗。用 C 语言实现相同任务会快得多(为简洁起见,省略变量声明、初始化、内存分配等代码):
for (i = 0; i < rows; i++) {
c[i] = a[i]*b[i];
}
这种做法避免了 Python 代码解释和对象操作的开销,但牺牲了 Python 编程的便利性。此外,代码量会随数据维度增加而增长。例如处理二维数组时,C 代码(如前所述省略部分内容)会扩展为:
for (i = 0; i < rows; i++) {
for (j = 0; j < columns; j++) {
c[i][j] = a[i][j]*b[i][j];
}
}
NumPy 结合了两者的优势:当涉及 ndarray
时,“逐元素操作” 是默认模式,但这些操作通过预编译的 C 代码快速执行。在 NumPy 中:
c = a * b
能以接近 C 的速度完成前述示例的操作,同时保持 Python 代码的简洁性。实际上,NumPy 的语法更加简洁!这个例子展示了 NumPy 的两大核心特性:向量化(vectorization) 和 广播(broadcasting)。
为什么 NumPy 速度快?
向量化指代码中无需显式编写循环、索引等操作——这些操作实际上在优化后的预编译 C 代码中"幕后"执行。向量化代码具有以下优势:
- 简洁易读:代码更简洁且更易理解
- 减少错误:代码行数减少通常意味着更少错误
- 贴近数学表达:代码更接近标准数学符号(通常能更准确地编码数学结构)
- Python 风格:向量化使代码更符合 Python 风格。没有向量化,代码将充满低效且难以阅读的
for
循环
广播(broadcasting)是描述操作隐式逐元素行为的术语。通常,NumPy 中的所有操作(不仅算术运算,还包括逻辑、位运算、函数操作等)都以这种隐式逐元素方式表现,即它们会广播。此外,在上例中,a
和 b
可以是同形状的多维数组、标量与数组,甚至不同形状的数组(前提是较小数组可按明确规则扩展为较大数组的形状)。广播的详细规则请参阅 广播机制。
还有谁在使用 NumPy?
NumPy 完全支持面向对象编程范式,其核心 ndarray
便是一个类,具有众多方法和属性。许多方法在 NumPy 最外层的命名空间中有对应的函数,允许程序员按偏好选择编程范式。这种灵活性使 NumPy 数组语法和 ndarray
类成为 Python 中多维数据交换的事实标准。
安装 NumPy
提示 本页面假设您熟悉终端操作,并且了解包管理器的使用。
安装 NumPy 的唯一前提是您已经安装了 Python。如果您还没有安装 Python,并且希望以最简单的方式开始,我们建议您使用 Anaconda 发行版 —— 它包含了 Python、NumPy 以及许多其他常用于科学计算和数据科学的包。
安装 NumPy 的推荐方法取决于您的工作流程偏好。以下是按类别划分的安装方法:
- 基于项目的安装方法(例如 uv、pixi)(推荐新用户使用)
- 基于环境的安装方法(例如 pip、conda)(传统工作流程)
- 系统包管理器安装(不推荐大多数用户使用)
- 从源代码构建(适用于高级用户和开发目的)
请选择最适合您的需求的方法。如果您不确定,建议从使用 conda
或 pip
的基于环境的安装方法开始。
以下是安装 NumPy的不同方法。
基于项目
推荐新用户使用,以获得流畅的工作流程。
- uv:一个现代的 Python 包管理器,旨在实现速度和简单性。
uv pip install numpy
- pixi:一个跨平台的 Python 和其他语言的包管理器。
pixi add numpy
基于环境
安装 Python 包的两个主要工具是 pip
和 conda
。它们的功能部分重叠(例如,两者都可以安装 numpy
),但它们也可以一起使用。我们将在这里讨论 pip 和 conda 之间的主要区别——如果您想有效地管理包,了解这些区别很重要。
第一个区别是 conda 是跨语言的,它可以安装 Python,而 pip 是为系统中特定的 Python 安装的,并且只安装到同一个 Python 安装中的其他包。这也意味着 conda 可以安装您可能需要的非 Python 库和工具(例如编译器、CUDA、HDF5),而 pip 则不能。
第二个区别是 pip 从 Python 包索引(PyPI)安装,而 conda 从自己的通道安装(通常是“defaults”或“conda-forge”)。PyPI 是迄今为止最大的包集合,然而,所有流行的包也都可以通过 conda 获得。
第三个区别是 conda 是一个集成的包、依赖项和环境管理解决方案,而使用 pip 时,您可能需要另一个工具(有很多!)来处理环境或复杂的依赖项。
- Conda:如果您使用 conda,可以从 defaults 或 conda-forge 通道安装 NumPy:
conda create -n my-env
conda activate my-env
conda install numpy
- Pip:
pip install numpy
提示:使用虚拟环境以更好地管理依赖项
python -m venv my-env
source my-env/bin/activate # macOS/Linux
my-env\Scripts\activate # Windows
pip install numpy
系统包管理器
不推荐大多数用户使用,但出于方便提供。
macOS(Homebrew):
brew install numpy
Linux(APT):
sudo apt install python3-numpy
Windows(Chocolatey):
choco install numpy
从源代码构建
对于想要定制或调试 NumPy 的高级用户和开发人员。
警告:从源代码构建 NumPy 可能是一项非平凡的任务。
如果您的平台可以通过上述方法之一获得二进制文件,我们建议使用二进制文件。
有关如何从源代码构建的详细信息,请参阅 NumPy 文档中的从源代码构建指南。
验证安装
安装 NumPy 后,通过在 Python shell 或脚本中运行以下代码来验证安装:
import numpy as np
print(np.__version__)
这应该会打印出已安装的 NumPy 版本,而不会出现错误。
故障排除
如果您的安装失败,并出现以下消息,请参阅故障排除部分的 ImportError
。
重要提示:请阅读以下内容以获取解决此问题的建议!
导入 NumPy C 扩展失败。此错误可能因不同原因而出现,通常与您的设置有关。
风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。