Python 现代开发学习笔记

(三)dtype 决定元素的保存与计算

1. 固定宽度整数与 Python 整数

dtype 表示元素的数据类型。int64 是 64 位有符号整数,float64 是 64 位浮点数,bool_ 保存布尔值。与 Python 的普通 int 相比,数组整数有固定宽度:

# 项目文件:demos/dtypes.py
# Python 整数可以继续增大,固定字节数的数组整数会溢出;先转换再运算。
import numpy as np

small = np.array([120], dtype=np.int8)
print("Python", 120 + 10)
print("int8", (small + np.array([10], dtype=np.int8)).tolist())
print("先转宽", (small.astype(np.int64) + 10).tolist())
floats = np.array([1.9, -1.9], dtype=np.float64)
print("转整数", floats.astype(np.int64).tolist())
print("除法", (np.array([1, 2]) / 2).tolist())
print("每项字节", np.dtype(np.int64).itemsize, np.dtype(np.float32).itemsize)

Python 的 120+10 为 130。int8 数组只能用 8 位保存整数,两个 int8 数组相加后得到 −126;先通过 astype 转为 int64,再相加就得到 130。溢出以后再转换,只会把已经错误的 −126 放进更宽的类型。

float64 转整数时,示例中的 1.9 与 −1.9 分别变成 1、−1,方向是向零截断。整数数组使用 / 得到浮点结果;需要保留小数的中间结果,也应让保存它的数组使用浮点 dtype。NumPy 数值类型

120加10在固定8位数组中环绕为负126,先扩大保存类型再计算得到130

2. 先算数据占用,再选择保存方式

一百万个 float64 元素的 nbytes 为 1_000_000×8=8_000_000,约 7.63 MiB;float32 约为一半。较小的类型也会改变精度或数值范围,不能只比较文件大小。第一轮计算先用明确的 int64、float64,掌握结果后再比较更紧凑的表示。

ndarray 中取出的单个数可能是 NumPy 标量。需要交给 JSON 等接口时,可以用 .item() 取得普通 Python 数值;整个数组用 .tolist() 变成嵌套列表。本章的统计报告会在保存前完成这些转换。

笔记正文与全部题解 · Ctrl / ⌘ K