type
status
date
slug
summary
tags
category
icon
password
comment
为什么要关注 dtype?
- 用 numpy 处理数据时,dtype 决定了内存占用和精度。
- 很多“奇怪报错”其实就是类型不兼容,或者数值溢出/精度丢失。
- 比如 float64 和 int32 都能存数字,但本质很不同。
numpy 常见 dtype 一览
这一部分没必要死记,但常用的那些需要知道:
- int8, int16, int32, int64:有符号整数,不同字节,范围越来越大,内存也越来越大。
- uint8, uint16, ...:无符号,只能存正数,范围大一倍(比如图像处理中常用 uint8 表示 0-255)。
- float16, float32, float64:小数,精度和存储空间依次递增。float64 最常见、最通用,float32 适合神经网络场景、节省内存。
- complex64, complex128:复数(其实就是两个 float 拼一起)。
- bool:True/False,虽然理论上 1bit 就够,numpy 实际占 1字节。
- object:万能类型,实际上很慢,只有非规整结构才用。
- string_ / unicode_:numpy 支持定长字符串(S10、U10),其实很少用,数据表或文本更推荐 object。
dtype 的实际用法(Python 演示)
什么时候用什么类型?
- 内存敏感(大数据量/深度学习):用 float32、int32,甚至 uint8(比如图像、mask)。
- 需要高精度科学计算:float64、int64。
- 做索引/分组:int32 足够(pandas 默认 int64)。
- 布尔数组:bool,常用于掩码(mask)、筛选。
- 字符串、杂项:数据规整就用 string_,否则 object。
一些实际踩坑体会
- int/float 混用运算:结果会自动升级为 float。
- float16/float32 精度问题:比如 (0.1 + 0.2 != 0.3) 这种,机器学习和科学计算有坑。
- astype 强制转换:小心数据截断,特别是 float -> int 会直接去掉小数。
- pandas 默认都是 float64/int64,但其实很多场景降级为 float32 更省内存。
- bool 用于掩码选择很高效,但存储不是最省(不是1bit,是1byte)。
dtype 选择总结
- 默认 float64、int64 就够用,内存压力大了再考虑 float32、int32。
- 图像/掩码类适合 uint8。
- 机器学习/深度学习建议 float32,float16 训练速度快但精度低(慎用)。
- 字符串杂项 object/string_,一般做文本分析推荐 object。
小结
不用一上来就纠结类型,但出错/数据大了/速度慢时,一定要排查 dtype。
平时善用
.astype(),多看 arr.dtype,遇到奇怪的类型报错,记得查文档或 print(type/值/arr.dtype)。