文章摘要
LCY AI Pro

本章节系统介绍了 Python 中 NumPy 的入门知识,先讲解 pipconda、源码等常见安装方式及版本验证方法,再梳理 NumPy 常用数值类型与字符代码映射,重点说明 dtype 对象的作用与结构化数据类型的创建和使用。随后结合示例解析 ndarray 的核心属性,包括 ndimshapeitemsizeflags 等,帮助读者建立数组维度、内存布局和数据表示的基础认知,为后续数值计算与数据分析学习打下坚实基础。

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
2
import numpy as np
print(np.__version__)

如果安装成功,会输出正确的版本号信息:

1
2.4.4

注:此处的版本号2.4.4NumPy于2026年3月29日发布的版本,实际验证时可能存在版本差异,不影响后续的教程。


使用已有的发行版本

对于许多用户,尤其是在 Windows 上,最简单的方法是下载以下的 Python 发行版,它们包含了所有的关键包(包括 NumPySciPymatplotlibIPythonSymPy 以及 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 语言中的 longint32int64
intc 与 C 的 int 类型一样,一般是 int32int 64
intp 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32int64
int8 字节(范围:-128127
int16 整数(范围:-3276832767
int32 整数(范围:-21474836482147483647
int64 整数(范围:-92233720368547758089223372036854775807
uint8 无符号整数(范围:0255
uint16 无符号整数(范围:065535
uint32 无符号整数(范围:04294967295
uint64 无符号整数(范围:018446744073709551615
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.int32np.float32,等等。


数据类型对象 (dtype)

数据类型对象(numpy.dtype 类的实例)用来描述与数组对应的内存区域是如何使用,它描述了数据的以下几个方面:

  • 数据的类型(整数,浮点数或者 Python 对象)
  • 数据的大小(例如, 整数使用多少个字节存储)
  • 数据的字节顺序(小端法或大端法)
  • 在结构化类型的情况下,字段的名称、每个字段的数据类型和每个字段所取的内存块的部分
  • 如果数据类型是子数组,那么它的形状和数据类型是什么。

字节顺序是通过对数据类型预先设定 <> 来决定的。 < 意味着小端法(最小值存储在最小的地址,即低位组放在最前面)。> 意味着大端法(最重要的字节存储在最小的地址,即高位组放在最前面)。

dtype 对象是使用以下语法构造的:

1
numpy.dtype(object, align, copy)
  • object - 要转换为的数据类型对象
  • align - 如果为 True,填充字段使其类似 C 的结构体。
  • copy - 复制 dtype 对象 ,如果为 False,则是对内置数据类型对象的引用

实例

接下来,我们可以通过一些实例来理解。

实例 1

1
2
3
4
import numpy as np
# 使用标量类型
dt = np.dtype(np.int32)
print(dt)

输出结果为:

1
int32

实例 2

1
2
3
4
import numpy as np
# int8, int16, int32, int64 四种数据类型可以使用字符串 'i1', 'i2','i4','i8' 代替
dt = np.dtype('i4')
print(dt)

输出结果为:

1
int32

实例 3

1
2
3
4
import numpy as np
# 字节顺序标注
dt = np.dtype('< i4')
print(dt)

输出结果为:

1
int32

实例 4

下面的实例展示结构化数据类型的使用,类型字段和对应的实际类型将被创建。

1
2
3
4
# 首先创建结构化数据类型
import numpy as np
dt = np.dtype([('age', np.int8)])
print(dt)

输出结果为:

1
[('age', 'i1')]

实例 5

1
2
3
4
5
# 将数据类型应用于 ndarray 对象
import numpy as np
dt = np.dtype([('age', np.int8)])
a = np.array([(10,), (20,), (30,)], dtype = dt)
print(a)

输出结果为:

1
[(10,) (20,) (30,)]

实例 6

1
2
3
4
5
# 类型字段名可以用于存取实际的 age 列
import numpy as np
dt = np.dtype([('age', np.int8)])
a = np.array([(10,), (20,), (30,)], dtype = dt)
print(a['age'])

输出结果为:

1
[10 20 30]

实例 7

下面的实例定义一个结构化数据类型 student,包含字符串字段 name,整数字段 age,及浮点字段 marks,并将这个 dtype 应用到 ndarray 对象。

1
2
3
import numpy as np
student = np.dtype([('name', 'S20'), ('age', 'i1'), ('marks', 'f4')])
print(student)

输出结果为:

1
[('name', 'S20'), ('age', 'i1'), ('marks', 'f4')]

实例 8

1
2
3
4
import numpy as np
student = np.dtype([('name', 'S20'), ('age', 'i1'), ('marks', 'f4')])
a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student)
print(a)

输出结果为:

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),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。

很多时候可以声明 axisaxis = 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
2
3
4
5
6
7
import numpy as np 

a = np.arange(24)
print (a.ndim) # a 现只有一个维度
# 现在调整其大小
b = a.reshape(2,4,3) # b 现在拥有三个维度
print (b.ndim)

输出结果为:

1
2
1
3

ndarray.shape

ndarray.shape 表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 ndim 属性(秩)。比如,一个二维数组,其维度表示"行数"和"列数"。

ndarray.shape 也可以用于调整数组大小。

实例

1
2
3
4
import numpy as np  

a = np.array([[1,2,3],[4,5,6]])
print (a.shape)

输出结果为:

1
(2, 3)

实例

以下实例调整了数组大小。

1
2
3
4
5
import numpy as np 

a = np.array([[1,2,3],[4,5,6]])
a.shape = (3,2)
print (a)

输出结果为:

1
2
3
[[1 2]
[3 4]
[5 6]]

实例

NumPy 也提供了 reshape 函数来调整数组大小。

1
2
3
4
5
import numpy as np 

a = np.array([[1,2,3],[4,5,6]])
b = a.reshape(3,2)
print (b)

输出结果为:

1
2
3
[[1 2]
[3 4]
[5 6]]

ndarray.itemsize

ndarray.itemsize 以字节的形式返回数组中每一个元素的大小。

例如,一个元素类型为 float64 的数组 itemsize 属性值为 8 (float64 占用 64 比特,即占用 8 个字节),又如,一个元素类型为 complex32 的数组 item 属性为 4

实例

1
2
3
4
5
6
7
8
9
import numpy as np 

# 数组的 dtype 为 int8(一个字节)
x = np.array([1,2,3,4,5], dtype = np.int8)
print (x.itemsize)

# 数组的 dtype 现在为 float64(八个字节)
y = np.array([1,2,3,4,5], dtype = np.float64)
print (y.itemsize)

输出结果为:

1
2
1
8

ndarray.flags

ndarray.flags 返回 ndarray 对象的内存信息,包含以下属性:

属性 描述
C_CONTIGUOUS (C) 数据是在一个单一的C风格的连续段中
F_CONTIGUOUS (F) 数据是在一个单一的Fortran风格的连续段中
OWNDATA (O) 数组拥有它所使用的内存或从另一个对象中借用它
WRITEABLE (W) 数据区域可以被写入,将该值设置为 False,则数据为只读
ALIGNED (A) 数据和所有元素都适当地对齐到硬件上
UPDATEIFCOPY (U) 这个数组是其它数组的一个副本,当这个数组被释放时,原数组的内容将被更新

实例

1
2
3
4
import numpy as np 

x = np.array([1,2,3,4,5])
print (x.flags)

输出结果为:

1
2
3
4
5
6
7
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False

To be continued.