np.save/np.load仅支持二进制.npy格式,专为NumPy设计,含dtype、shape元信息,不兼容CSV/Excel;savez/savez_compressed可打包多个数组为.npz,加载后为只读NpzFile对象,需用data["key"]访问,且dtype严格保留,易致下游异常。

save 和 load 只能读写 .npy 文件,不是通用格式
NumPy 的 np.save 和 np.load 专为 NumPy 自身设计,存的是二进制 .npy 格式,带 dtype、shape 等元信息。它不兼容 Excel、CSV 或其他语言直接读取——如果你需要跨平台或人工查看,别用这对函数。
常见错误现象:np.load("data.csv") 报 ValueError:未能识别文件头;或者用 Python 加载后发现数组 dtype 变成 object,其实是误存了 list 而非 array。
- 确保输入是真正的
np.ndarray,不是list或pd.Series:先做np.asarray(data) - 文件扩展名必须是
.npy(np.save会自动加,但np.load不会猜) - 路径中含中文或空格时,Windows 下容易出错,建议用绝对路径或
pathlib.Path构造
savez 和 savez_compressed 支持多个数组打包
单个 .npy 只能存一个数组;要保存 X、y、metadata 等多个变量,得用 np.savez 或压缩版 np.savez_compressed。
使用场景:训练数据切分后保存 X_train、X_test、y_train,避免分散多个文件、命名混乱。
-
np.savez("data.npz", X=X_train, y=y_train)—— 键名会成为加载后的字段名 - 加载后是
np.lib.npyio.NpzFile对象,用data["X"]取值,不是字典,不支持.keys()迭代(得用list(data.keys())) -
savez_compressed体积通常小 30–70%,但保存/加载稍慢;科学计算中推荐默认用它
load 返回视图还是副本?内存和修改风险要注意
np.load 默认返回内存映射(mmap_mode=None),即读取时不全载入内存,而是按需访问——这对大数组友好,但有个关键副作用:返回的对象是只读的。如果代码里写了 arr[0] = 1,会立刻报 ValueError: assignment destination is read-only。
- 想可写,加参数
np.load("x.npy", mmap_mode="r+")(需文件系统支持)或更稳妥地用np.load(...).copy() - 如果原始数组很大(>1GB),盲目
.copy()可能触发 OOM;先确认是否真需要修改,否则保持只读更安全 -
npz文件里的每个数组也默认只读,同样适用上述规则
dtype 不一致导致 load 后数值异常
NumPy 存储时严格保留 dtype,比如 np.int32 存进去,np.load 出来还是 int32。问题在于:Python 整数默认是 int64,Pandas 默认用 int64,模型库(如 scikit-learn)有时对 int32 输入行为异常(例如树模型报 ValueError: Unknown label type)。
- 保存前显式统一 dtype:
np.save("x.npy", x.astype(np.float32))(尤其适合深度学习输入) - 不要依赖
np.save的自动推断——np.array([1, 2, 3])是int64,但np.array([1, 2, 3.0])就变成float64,容易埋坑 - 加载后检查:
print(arr.dtype),别只看arr.shape
实际项目里最常被忽略的,是 np.load 的只读性与 dtype 隐式转换这两点——它们不会报错,但会在下游模型训练或数据拼接时突然崩掉,且 traceback 很难定位到源头。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











