
Python 中的 NumPy 模块
本章节系统介绍了 Python 中 NumPy 的入门知识,先讲解 pip、conda、源码等常见安装方式及版本验证方法,再梳理 NumPy 常用数值类型与字符代码映射,重点说明 dtype 对象的作用与结构化数据类型的创建和使用。随后结合示例解析 ndarray 的核心属性,包括 ndim、shape、itemsize、flags 等,帮助读者建立数组维度、内存布局和数据表示的基础认知,为后续数值计算与数据分析学习打下坚实基础。
NumPy 库的安装
Python 官网上的发行版是不包含 NumPy 库的。
但是,我们可以使用以下几种方法来安装。
使用 pip 安装
我们可以使用以下命令安装最新版的 NumPy 库:
1 | pip3 install numpy |
使用 conda 安装
如果使用的是 Anaconda 环境,可以使用 conda 来安装 NumPy:
1 | conda install numpy |
通过 conda 安装的 NumPy 通常会带有一些优化的数学库(如 Intel MKL),可以提高性能。
从源代码安装
如果需要从源代码安装 NumPy,可以在 NumPy 官方 GitHub 仓库下载源码:https://github.com/numpy/numpy,进入解压后的目录并执行以下命令:
1 | python setup.py install |
安装验证
无论使用哪种方式安装完成后,都可以通过以下代码令验证 NumPy 是否安装成功:
1 | import numpy as np |
如果安装成功,会输出正确的版本号信息:
1 | 2.4.4 |
注:此处的版本号
2.4.4为NumPy于2026年3月29日发布的版本,实际验证时可能存在版本差异,不影响后续的教程。
使用已有的发行版本
对于许多用户,尤其是在 Windows 上,最简单的方法是下载以下的 Python 发行版,它们包含了所有的关键包(包括 NumPy,SciPy,matplotlib,IPython,SymPy 以及 Python 核心自带的其它包):
- Anaconda: 免费 Python 发行版,用于进行大规模数据处理、预测分析,和科学计算,致力于简化包的管理和部署。支持 Linux, Windows 和 Mac 系统。
- Enthought Canopy: 提供了免费和商业发行版。持 Linux, Windows 和 Mac 系统。
- Python(x,y): 个适用于科学计算和数据分析的 Python 发行版,专门为 提供了 Spyder IDE 等工具,适合进行科学计算的开发工作。
- WinPython: 另一个免费的 Python 发行版,包含科学计算包与 Spyder IDE。支持 Windows。
- Pyzo: 基于 Anaconda 的免费发行版本及 IEP 的交互开发环境,超轻量级。 支持 Linux, Windows 和 Mac 系统。
NumPy 数据类型
NumPy 支持的数据类型比 Python 内置的类型要多很多,基本上可以和 C 语言的数据类型对应上,其中部分类型对应为 Python 内置的类型。下表列举了常用 NumPy 基本类型。
| 名称 | 描述 |
|---|---|
bool_ |
布尔型数据类型(True 或者 False) |
int_ |
默认的整数类型(类似于 C 语言中的 long,int32 或 int64) |
intc |
与 C 的 int 类型一样,一般是 int32 或 int 64 |
intp |
用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64) |
int8 |
字节(范围:-128 至 127) |
int16 |
整数(范围:-32768 至 32767) |
int32 |
整数(范围:-2147483648 至 2147483647) |
int64 |
整数(范围:-9223372036854775808 至 9223372036854775807) |
uint8 |
无符号整数(范围:0 至 255) |
uint16 |
无符号整数(范围:0 至 65535) |
uint32 |
无符号整数(范围:0 至 4294967295) |
uint64 |
无符号整数(范围:0 至 18446744073709551615) |
float_ |
float64 类型的简写 |
float16 |
半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 |
float32 |
单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 |
float64 |
双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 |
complex_ |
complex128 类型的简写,即 128 位复数 |
complex64 |
复数,表示双 32 位浮点数(实数部分和虚数部分) |
complex128 |
复数,表示双 64 位浮点数(实数部分和虚数部分) |
NumPy 的数值类型实际上是 dtype 对象的实例,并对应唯一的字符,包括 np.bool_,np.int32,np.float32,等等。
数据类型对象 (dtype)
数据类型对象(numpy.dtype 类的实例)用来描述与数组对应的内存区域是如何使用,它描述了数据的以下几个方面:
- 数据的类型(整数,浮点数或者 Python 对象)
- 数据的大小(例如, 整数使用多少个字节存储)
- 数据的字节顺序(小端法或大端法)
- 在结构化类型的情况下,字段的名称、每个字段的数据类型和每个字段所取的内存块的部分
- 如果数据类型是子数组,那么它的形状和数据类型是什么。
字节顺序是通过对数据类型预先设定 < 或 > 来决定的。 < 意味着小端法(最小值存储在最小的地址,即低位组放在最前面)。> 意味着大端法(最重要的字节存储在最小的地址,即高位组放在最前面)。
dtype 对象是使用以下语法构造的:
1 | numpy.dtype(object, align, copy) |
object- 要转换为的数据类型对象align- 如果为True,填充字段使其类似 C 的结构体。copy- 复制dtype对象 ,如果为False,则是对内置数据类型对象的引用
实例
接下来,我们可以通过一些实例来理解。
实例 1
1 | import numpy as np |
输出结果为:
1 | int32 |
实例 2
1 | import numpy as np |
输出结果为:
1 | int32 |
实例 3
1 | import numpy as np |
输出结果为:
1 | int32 |
实例 4
下面的实例展示结构化数据类型的使用,类型字段和对应的实际类型将被创建。
1 | # 首先创建结构化数据类型 |
输出结果为:
1 | [('age', 'i1')] |
实例 5
1 | # 将数据类型应用于 ndarray 对象 |
输出结果为:
1 | [(10,) (20,) (30,)] |
实例 6
1 | # 类型字段名可以用于存取实际的 age 列 |
输出结果为:
1 | [10 20 30] |
实例 7
下面的实例定义一个结构化数据类型 student,包含字符串字段 name,整数字段 age,及浮点字段 marks,并将这个 dtype 应用到 ndarray 对象。
1 | import numpy as np |
输出结果为:
1 | [('name', 'S20'), ('age', 'i1'), ('marks', 'f4')] |
实例 8
1 | import numpy as np |
输出结果为:
1 | [(b'abc', 21, 50.) (b'xyz', 18, 75.)] |
补充
每个内建类型都有一个唯一定义它的字符代码,如下:
| 字符 | 对应类型 |
|---|---|
b |
布尔型 |
i |
(有符号) 整型 |
u |
无符号整型 integer |
f |
浮点型 |
c |
复数浮点型 |
m |
timedelta(时间间隔) |
M |
datetime(日期时间) |
O |
(Python) 对象 |
S, a |
(byte-)字符串 |
U |
Unicode |
V |
原始数据 (void) |
NumPy 中的数组属性
本章节我们将来了解 NumPy 数组的一些基本属性。
NumPy 数组的维数称为秩(rank),秩就是轴的数量,即数组的维度,一维数组的秩为 1,二维数组的秩为 2,以此类推。
在 NumPy 中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。所以一维数组就是 NumPy 中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。
很多时候可以声明 axis。axis = 0,表示沿着第 0 轴进行操作,即对每一列进行操作;axis = 1,表示沿着第1轴进行操作,即对每一行进行操作。
NumPy 的数组中比较重要的 ndarray 对象属性有:
| 属性 | 说明 |
|---|---|
ndarray.ndim |
数组的秩(rank),即数组的维度数量或轴的数量。 |
ndarray.shape |
数组的维度,表示数组在每个轴上的大小。对于二维数组(矩阵),表示其行数和列数。 |
ndarray.size |
数组中元素的总个数,等于 ndarray.shape 中各个轴上大小的乘积。 |
ndarray.dtype |
数组中元素的数据类型。 |
ndarray.itemsize |
数组中每个元素的大小,以字节为单位。 |
ndarray.flags |
包含有关内存布局的信息,如是否为 C 或 Fortran 连续存储,是否为只读等。 |
ndarray.real |
数组中每个元素的实部(如果元素类型为复数)。 |
ndarray.imag |
数组中每个元素的虚部(如果元素类型为复数)。 |
ndarray.data |
实际存储数组元素的缓冲区,一般通过索引访问元素,不直接使用该属性。 |
ndarray.ndim
ndarray.ndim 用于获取数组的维度数量(即数组的轴数)。
实例
1 | import numpy as np |
输出结果为:
1 | 1 |
ndarray.shape
ndarray.shape 表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 ndim 属性(秩)。比如,一个二维数组,其维度表示"行数"和"列数"。
ndarray.shape 也可以用于调整数组大小。
实例
1 | import numpy as np |
输出结果为:
1 | (2, 3) |
实例
以下实例调整了数组大小。
1 | import numpy as np |
输出结果为:
1 | [[1 2] |
实例
NumPy 也提供了 reshape 函数来调整数组大小。
1 | import numpy as np |
输出结果为:
1 | [[1 2] |
ndarray.itemsize
ndarray.itemsize 以字节的形式返回数组中每一个元素的大小。
例如,一个元素类型为 float64 的数组 itemsize 属性值为 8 (float64 占用 64 比特,即占用 8 个字节),又如,一个元素类型为 complex32 的数组 item 属性为 4。
实例
1 | import numpy as np |
输出结果为:
1 | 1 |
ndarray.flags
ndarray.flags 返回 ndarray 对象的内存信息,包含以下属性:
| 属性 | 描述 |
|---|---|
C_CONTIGUOUS (C) |
数据是在一个单一的C风格的连续段中 |
F_CONTIGUOUS (F) |
数据是在一个单一的Fortran风格的连续段中 |
OWNDATA (O) |
数组拥有它所使用的内存或从另一个对象中借用它 |
WRITEABLE (W) |
数据区域可以被写入,将该值设置为 False,则数据为只读 |
ALIGNED (A) |
数据和所有元素都适当地对齐到硬件上 |
UPDATEIFCOPY (U) |
这个数组是其它数组的一个副本,当这个数组被释放时,原数组的内容将被更新 |
实例
1 | import numpy as np |
输出结果为:
1 | C_CONTIGUOUS : True |
To be continued.
