NumPy 数据类型¶
NumPy 的 dtype 描述元素在内存中的二进制布局和运算语义。明确 dtype 可以控制精度、取值范围、内存占用以及与文件格式和本地代码的兼容性。
常用 dtype¶
| 类别 | 示例 | 说明 |
|---|---|---|
| 布尔 | np.bool_ |
真或假 |
| 有符号整数 | np.int8、np.int32、np.int64 |
固定位宽整数 |
| 无符号整数 | np.uint8、np.uint32 |
非负固定整数 |
| 浮点 | np.float32、np.float64 |
IEEE 浮点数 |
| 复数 | np.complex64、np.complex128 |
实部和虚部 |
| 字符串 | U10、S10 |
固定长度 Unicode 或字节串 |
| 日期时间 | datetime64、timedelta64 |
时间点与时间差 |
| 结构化类型 | 字段列表 | 类似固定布局记录 |
创建、检查与转换¶
import numpy as np
a = np.array([1, 2, 3], dtype=np.int16)
b = a.astype(np.float32)
print(a.dtype, a.itemsize)
print(b, b.dtype)
print(np.iinfo(np.int16))
print(np.finfo(np.float32).eps)
dt = np.dtype([("id", "<i4"), ("score", "<f8")])
records = np.array([(1, 91.5), (2, 87.0)], dtype=dt)
print(records["score"])
astype 默认创建新数组。若只需接受并检查输入,可使用 np.asarray(value, dtype=...);是否复制取决于输入是否已经满足要求。
类型提升与溢出¶
混合类型运算会根据 NumPy 的类型提升规则选择结果 dtype。固定宽度整数会溢出,且不会自动变成 Python 大整数:
import numpy as np
x = np.array([127], dtype=np.int8)
print(x + np.int8(1))
values = np.array([1, 2, 3], dtype=np.int32)
print((values + 0.5).dtype)
常见错误与工程注意事项¶
- 金额等十进制定点数据不应盲目使用二进制浮点;根据精度要求使用整数最小单位、
decimal或专用类型。 float32可节省一半内存,但累计求和、优化算法和条件较差的问题可能需要float64。np.nan是浮点值,普通整数数组不能直接表示;可使用掩码、哨兵值或上层 nullable 类型。- 固定长度字符串会截断超长赋值,创建时应选择足够长度,或在边界处保留 Python 字符串。
- 避免平台相关的裸
int宽度假设;持久化和网络协议应明确写int32、int64与字节序。 - 转换前用范围检查防止静默截断;不能安全转换时可先用
np.can_cast判断。