NumPy 数据类型全面总结
NumPy 的数据类型(dtype)是其高效数值计算的核心基础,设计目标是覆盖所有数值场景、精准控制内存占用,同时兼容 C/Python 原生类型。以下按类型分类全面梳理,含核心特性、用途及关键细节:
一、核心数值类型(最常用)
1. 整数类型(integer)
| dtype 简写 |
完整名称 |
字节数 |
取值范围(示例,64位系统) |
核心用途 |
np.int8 |
8位有符号整数 |
1 |
-128 ~ 127 |
内存受限场景(如传感器数据) |
np.int16 |
16位有符号整数 |
2 |
-32768 ~ 32767 |
中等精度整数计算 |
np.int32 |
32位有符号整数 |
4 |
-2³¹ ~ 2³¹-1 |
主流整数场景(平衡精度与内存) |
np.int64 |
64位有符号整数 |
8 |
-2⁶³ ~ 2⁶³-1 |
高精度整数计算(无溢出风险) |
np.uint8 |
8位无符号整数 |
1 |
0 ~ 255 |
图像像素数据(0-255灰度值) |
np.uint16 |
16位无符号整数 |
2 |
0 ~ 65535 |
无负数值场景(如计数统计) |
np.uint32 |
32位无符号整数 |
4 |
0 ~ 2³²-1 |
大数值计数(无符号需求) |
np.uint64 |
64位无符号整数 |
8 |
0 ~ 2⁶⁴-1 |
超大数据计数 |
- 关键说明:
- 默认整数类型:
np.int_(等价于 np.int64,64位系统)/ np.int32(32位系统),与系统位数一致;
- 无符号类型(
uint)仅存储非负数,相同字节数下取值范围是有符号的2倍。
2. 浮点数类型(floating)
| dtype 简写 |
完整名称 |
字节数 |
精度特征 |
核心用途 |
np.float16 |
半精度浮点数 |
2 |
16位(1符号+5指数+10尾数),精度低 |
内存极度受限场景(如AI推理) |
np.float32 |
单精度浮点数 |
4 |
32位(1符号+8指数+23尾数),中等精度 |
科学计算、机器学习(平衡速度与精度) |
np.float64 |
双精度浮点数 |
8 |
64位(1符号+11指数+52尾数),高精度 |
主流数值计算(默认浮点数类型) |
np.float_ |
系统默认浮点数 |
8 |
等价于 np.float64(64位系统) |
通用浮点数场景 |
np.longdouble |
扩展精度浮点数 |
8/10/16 |
精度高于float64(依赖系统) |
超高精度计算(如物理模拟) |
- 关键说明:
- 浮点数存在精度误差(如
0.1 + 0.2 ≠ 0.3),需通过 np.isclose() 判断相等;
float32 内存仅为 float64 的一半,在大数据量场景(如深度学习)中可大幅节省内存。
3. 复数类型(complex)
| dtype 简写 |
完整名称 |
字节数 |
构成(实部+虚部) |
核心用途 |
np.complex64 |
单精度复数 |
8 |
2个float32(实部+虚部) |
信号处理、傅里叶变换 |
np.complex128 |
双精度复数 |
16 |
2个float64(实部+虚部) |
主流复数计算(默认复数类型) |
np.complex_ |
系统默认复数 |
16 |
等价于 np.complex128 |
通用复数场景 |
- 关键说明:
- 复数赋值用
np.array([1+2j, 3+4j]),实部/虚部分别通过 .real/.imag 属性获取。
二、辅助数值类型(特殊场景)
1. 布尔类型(boolean)
| dtype 简写 |
完整名称 |
字节数 |
取值范围 |
核心用途 |
np.bool_ |
布尔类型 |
1 |
True/False(存储为1/0) |
逻辑判断、掩码筛选 |
np.bool8 |
8位布尔类型 |
1 |
与 np.bool_ 等价 |
兼容低版本NumPy |
- 关键说明:
- 与Python原生
bool的区别:NumPy布尔数组支持向量化运算(如 arr > 0),内存占用更低(1字节/元素 vs Python的28字节/对象)。
2. 无符号整数(特殊用途)
| dtype 简写 |
完整名称 |
字节数 |
核心用途 |
np.byte |
等价于 np.int8 |
1 |
兼容C语言的char类型 |
np.ubyte |
等价于 np.uint8 |
1 |
图像、二进制数据存储 |
np.short |
等价于 np.int16 |
2 |
兼容C语言的short类型 |
np.ushort |
等价于 np.uint16 |
2 |
兼容硬件设备数据格式 |
np.intc |
等价于C的int |
4/8 |
与C语言交互时使用 |
np.uintc |
等价于C的unsigned int |
4/8 |
与C语言无符号整数交互 |
三、字符串与Unicode类型
| dtype 简写 |
完整名称 |
存储方式 |
核心用途 |
np.string_ |
字节字符串类型 |
存储字节序列(ASCII编码) |
兼容Python2字符串、二进制数据 |
np.unicode_ |
Unicode字符串类型 |
存储Unicode字符(UTF-32编码,4字节/字符) |
多语言文本处理 |
np.dtype('U[n]') |
固定长度Unicode |
最多存储n个Unicode字符(如U10) |
批量字符串存储(内存紧凑) |
np.dtype('S[n]') |
固定长度字节串 |
最多存储n个字节(如S10) |
ASCII字符串批量存储 |
- 关键说明:
np.string_ 对应Python的bytes类型,np.unicode_ 对应Python的str类型;
- 固定长度类型(
U[n]/S[n])内存紧凑,但超长字符串会被截断(需提前预估长度)。
四、结构化与记录类型(异构数据)
用于存储异构数据(类似数据库表、CSV行),通过指定字段名和类型创建:
1. 定义方式
# 方式1:字段名+类型简写
dt1 = np.dtype([('name', 'U10'), ('age', 'i4'), ('score', 'f8')])
# 方式2:字段名+类型+字节数
dt2 = np.dtype([('id', 'u2'), ('data', 'f4', 3)]) # data是3个float32的数组
# 方式3:字典格式(更清晰)
dt3 = np.dtype({
'names': ['name', 'age', 'score'],
'formats': ['U10', np.int32, np.float64]
})
2. 核心用途
- 存储CSV/数据库等异构表格数据(无需Pandas);
- 与C语言结构体交互(内存布局一致)。
五、时间日期类型(datetime64/timedelta64)
1. datetime64(时间点类型)
| dtype 格式 |
时间单位 |
字节数 |
核心用途 |
np.datetime64['Y'] |
年 |
8 |
年份统计 |
np.datetime64['M'] |
月 |
8 |
月份级时间序列 |
np.datetime64['D'] |
日 |
8 |
日期级时间序列(最常用) |
np.datetime64['h'] |
小时 |
8 |
小时级时间记录 |
np.datetime64['m'] |
分钟 |
8 |
分钟级时间记录 |
np.datetime64['s'] |
秒 |
8 |
秒级时间序列 |
np.datetime64['ms'] |
毫秒 |
8 |
毫秒级高精度时间 |
np.datetime64['us'] |
微秒 |
8 |
微秒级高精度时间 |
np.datetime64['ns'] |
纳秒 |
8 |
纳秒级高精度时间(如传感器) |
- 关键说明:
- 自动兼容Python的
datetime类型,支持向量化时间运算(如 dt1 - dt2 得到时间差);
- 默认单位由输入数据决定(如
np.array(['2025-01-01'], dtype='datetime64') 默认为'D')。
2. timedelta64(时间间隔类型)
| dtype 格式 |
时间单位 |
字节数 |
核心用途 |
np.timedelta64['D'] |
日 |
8 |
日期间隔计算 |
np.timedelta64['h'] |
小时 |
8 |
小时间隔计算 |
| ...(同datetime64单位) |
... |
... |
... |
- 关键说明:
- 用于存储两个
datetime64的差值(如 np.datetime64('2025-01-02') - np.datetime64('2025-01-01') 得到 1 days)。
六、其他特殊类型
1. 空类型(empty)
np.void / np.dtype('V[n]'):存储无类型二进制数据,n为字节数;
- 用途:存储未知格式的二进制数据(如文件流、硬件数据)。
2. 对象类型(object)
np.object_:存储Python对象的指针(如字符串、列表、字典);
- 特点:支持异构数据,但失去NumPy的内存优势和向量化运算能力(不推荐用于纯数值场景)。
3. 掩码数组类型(masked)
np.ma.MaskedArray:带缺失值标记的数组,通过mask属性标记无效值;
- 用途:处理含缺失值的数值数据(无需用
NaN填充)。
七、核心使用技巧
- ** dtype 转换**:通过
arr.astype(np.int32) 转换类型(注意精度丢失风险,如float64→int32会截断小数);
- 查看 dtype:数组的
.dtype 属性(如 arr.dtype);
- 自定义 dtype:结构化类型支持灵活定义(如
np.dtype([('x', 'f4'), ('y', 'f4')]) 存储2D坐标);
- 内存优化:根据数据范围选择最小可行类型(如8位图像用
uint8,而非int64,节省8倍内存)。
八、总结
NumPy 数据类型的设计核心是 “精准控制+高效兼容”:
- 数值类型覆盖从8位到64位的整数、浮点数、复数,满足不同精度和内存需求;
- 特殊类型(datetime64、结构化类型)适配时间序列、异构数据等场景;
- 与C/Python原生类型兼容,确保跨语言交互和底层性能。
实际使用时,优先根据数据特征选择具体 dtype(而非依赖默认类型),是提升NumPy程序效率的关键。
需要我补充 dtype 转换的常见陷阱(如精度丢失、溢出),或结构化类型的实战案例吗?