在 NumPy 中,数组不仅存储数据本身,还必须明确指定每个元素的数据类型。这一类型系统由 dtype(data type)对象统一管理。
与 Python 的动态类型不同,NumPy 数组中的元素通常具有统一的数据类型,并以固定字节数在内存中连续存储。这种设计使 NumPy 能够使用底层 C 语言实现高效的向量化计算,从而显著提高数值计算性能。
dtype 不仅描述元素的数据类型,还包含有关字节大小、字节顺序以及字段结构等信息。
一、dtype 的基本概念
dtype 是 NumPy 中用于描述数组元素类型的对象。
可以通过数组属性查看数据类型:
ndarray.dtype示例:
print(a.dtype)输出:
int64表明该数组的元素类型为 64 位整数。
可在创建数组时指定 dtype:
np.array(data, dtype=...)示例:
print(a.dtype)输出:
float64NumPy 数据类型具有以下特点:
• 数组中的元素通常具有统一类型
• 每个元素占用固定字节数
• 数据在内存中连续存储
• 运算可利用底层 C 语言优化与 SIMD 指令
因此,dtype 会影响数组的计算速度、内存占用以及数值精度。
NumPy dtype 所描述的数组元素数据类型可分为以下几类:
类型类别
示例
布尔
bool_
整数
int8, int16, int32, int64
无符号整数
uint8, uint16, uint32 , uint64
浮点
float16, float32, float64
( 部分平台支持 float128)
复数
complex64, complex128
(部分平台支持 complex256)
字符串
字节字符串 S
Unicode 字符串 U
对象
object_
时间
datetime64, timedelta64
结构化
structured dtype
原始数据
void
二、NumPy 的基本数值类型
NumPy 提供了一套独立于 Python 内置类型的数值类型系统。
1、整数类型(Integer)
整数类型用于表示整型数值。
常见整数类型:
类型
字节
int8
1
8 位整数
int16
2
16 位整数
int32
4
32 位整数
int64
8
64 位整数
uint8
1
无符号 8 位整数
uint16
2
无符号 16 位整数
uint32
4
无符号 32 位整数
uint64
8
无符号 64 位整数
示例:
print(a.dtype)输出:
int322、浮点类型(Floating Point)
浮点类型用于表示带小数的数值。
类型
字节
float16
2
半精度浮点
float32
4
单精度浮点
float64
8
双精度浮点
示例:
print(a.dtype)输出:
float323、复数类型(Complex)
复数类型用于表示复数。
类型
complex64
实部和虚部均为 float32
complex128
实部和虚部均为 float64
示例:
print(a.dtype)输出:
complex644、布尔类型(Boolean)
NumPy 的布尔 dtype 表示为 bool,其对应的 NumPy 标量类型为 np.bool_。
示例:
print(a.dtype)输出:
boolnp.bool_ 是 NumPy 的布尔标量类型,用于表示单个布尔值。
print(type(b)) #当 NumPy 数组的 dtype 为 bool 时,其内部每个元素实际上都是 np.bool_ 类型的标量对象。
print(type(a[0])) #三、dtype 类型代码
在 NumPy 中,每一种数据类型不仅有名称形式(如 int32、float64),还存在一种更简短的表示方式,称为类型代码(type code)。
类型代码通常由:
类型字母 + 字节数
组成。
常见类型代码:
类型代码
等价类型
i1
int8
8 位整数
i2
int16
16 位整数
i4
int32
32 位整数
i8
int64
64 位整数
u1
uint8
无符号 8 位整数
u2
uint16
无符号 16 位整数
u4
uint32
无符号 32 位整数
u8
uint64
无符号 64 位整数
f4
float32
单精度浮点
f8
float64
双精度浮点
c8
complex64
复数(两个 float32)
c16
complex128
复数(两个 float64)
示例:
print(a.dtype) # int32dtype 类型代码常见的类型字母:
字母
含义
b
布尔
i
有符号整数
u
无符号整数
f
浮点数
c
复数
S
字节字符串
U
Unicode 字符串
O
Python 对象
M
datetime64
m
timedelta64
V
void(原始数据)
类型代码通常用于以下场景。
(1)快速指定 dtype
dtype="f8"(2)结构化数组
dtype=[("age","i4"),("score","f4")](3)二进制数据解析
np.fromfile("data.bin", dtype="i2")(4)dtype 字符串表示
例如:
dtype(' )< 表示 little-endian 的 float64,f8 表示 8 字节浮点数。
四、字节序
NumPy dtype 还可以描述数据的字节顺序(byte order)。
符号
含义
little-endian
big-endian
本机字节序
示例:
print(dt)NumPy dtype 字符串格式是:
byteorder + type + size
例如:
float64在计算机体系结构与数据表示中:
英文
中文翻译
含义
little-endian
小端序 / 小端字节序
低位字节存放在低地址
big-endian
大端序 / 大端字节序
高位字节存放在低地址
字节序在二进制文件读写和跨平台数据交换中尤为重要。
五、其它数据类型
1、字符串类型
NumPy 支持固定长度字符串。
类型
S
字节字符串
U
Unicode 字符串
示例:
print(a.dtype)输出:
U10 表示最多长度为 10 的 Unicode 字符,< 是 dtype 表示格式中的字节序标记。
2、时间类型
NumPy 还提供专门的时间数据类型。
datetime64
用于表示日期和时间。
示例:
print(a)输出:
['2026-01-01' '2026-01-02']解释单位:
单位
含义
Y
M
D
h
小时
m
分钟
s
ms
毫秒
timedelta64
用于表示时间间隔。
示例:
print(a)输出:
[1 2 3]说明:这些数值表示时间间隔的数量,单位由 dtype 指定。例如 D 表示为天(day)为单位。
3、Python 对象类型
NumPy 也可以存储 Python 对象,dtype 类型为 object。
示例:
print(type(a[1]))输出示例:
numpy.object_ 是 NumPy 的对象标量类型。当数组的 dtype 为 object 时,每个元素实际上都是 numpy.object_ 类型的标量,用于封装任意 Python 对象。
也可以直接创建 numpy.object_ 标量:
print(type(x)) #dtype 为 object 的数组不再是纯数值数组,每个元素存储的是 Python 对象引用。
与普通 NumPy 数组相比:
• 计算速度较慢
• 不适合数值计算
• 通常只用于特殊数据结构
4、结构化数据类型
NumPy 允许数组元素包含多个字段,类似 C 语言中的结构体。
示例:
print(data)输出:
[('艾婉婷', 18, 88.5) ('岳露珊', 19, 92. )]访问字段:
print(data["age"])输出:
[18 19]说明:结构化数组适用于表格型记录数据。
六、类型转换
NumPy 可以使用 astype() 进行数据类型转换。
ndarray.astype(dtype)示例:
print(b.dtype)输出:
float64astype() 会创建新的数组。
小结
dtype 是 NumPy 数组的重要组成部分,用于描述数组元素的数据类型、字节大小以及存储结构。NumPy 提供整数、浮点数、复数、布尔、字符串和时间等多种数据类型,并支持结构化 dtype 用于记录型数据。创建数组时可以通过 dtype 指定元素类型,也可以使用 astype() 进行类型转换。理解 dtype 的机制,有助于更好地控制数组的内存结构、计算精度与计算性能。
“点赞有美意,赞赏是鼓励”
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.