NumPy 数据类型都有哪些?

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填充)。

七、核心使用技巧

  1. ** dtype 转换**:通过 arr.astype(np.int32) 转换类型(注意精度丢失风险,如float64→int32会截断小数);
  2. 查看 dtype:数组的 .dtype 属性(如 arr.dtype);
  3. 自定义 dtype:结构化类型支持灵活定义(如 np.dtype([('x', 'f4'), ('y', 'f4')]) 存储2D坐标);
  4. 内存优化:根据数据范围选择最小可行类型(如8位图像用uint8,而非int64,节省8倍内存)。

八、总结

NumPy 数据类型的设计核心是 “精准控制+高效兼容”

  • 数值类型覆盖从8位到64位的整数、浮点数、复数,满足不同精度和内存需求;
  • 特殊类型(datetime64、结构化类型)适配时间序列、异构数据等场景;
  • 与C/Python原生类型兼容,确保跨语言交互和底层性能。

实际使用时,优先根据数据特征选择具体 dtype(而非依赖默认类型),是提升NumPy程序效率的关键。

需要我补充 dtype 转换的常见陷阱(如精度丢失、溢出),或结构化类型的实战案例吗?

posted @ 2025-11-25 11:10  wangya216  阅读(122)  评论(0)    收藏  举报