本系列是《NumPy 速通》的配套章节。
把数组保存到磁盘,下次直接加载——省去每次重新计算的麻烦。本章覆盖三种格式:.npy(二进制、单个)、.npz(多个)、文本(CSV/TXT 交换用),外加加载时的**allow_pickle 陷阱**。
保存 / 加载单个数组
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
np.save("arr.npy", arr) # 保存,自动加 .npy 后缀
loaded = np.load("arr.npy") # 加载
print(loaded) # [1 2 3 4 5]
.npy 是 NumPy 专有格式,保存的是二进制,会连 dtype、shape 一起存下来,加载回来原样还原(类型、形状都不丢)。
保存多个数组:npz
一个文件里存多个数组:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
np.savez("data.npz", a=a, b=b) # 存多个,自动加 .npz
data = np.load("data.npz")
data["a"] # array([1, 2, 3])
data["b"] # array([4, 5, 6])
加载 .npz 得到的是一个类字典对象(NpzFile),用键名取值。
💡 savez_compressed:
np.savez_compressed("data.npz", a=a, b=b)用压缩存储,文件更小(适合大数据、文本类数据),代价是读写稍慢。
文本格式:与外部工具交换
需要和其他语言/工具交换数据时,用文本格式(CSV):
np.savetxt("arr.csv", arr, delimiter=",") # 存成 CSV
np.loadtxt("arr.csv", delimiter=",") # 读回
savetxt / loadtxt 常用参数
# 保存:可以加表头、控制格式
np.savetxt("data.csv", data, delimiter=",",
header="col1,col2,col3", # 表头
fmt="%.2f") # 保留 2 位小数
# 读取:跳过表头、跳过某列
np.loadtxt("data.csv", delimiter=",",
skiprows=1, # 跳过第 1 行表头
dtype=float)
⚠️ 用 genfromtxt 处理"缺数据"的文本
# loadtxt 遇缺数据会报错
np.loadtxt("messy.csv", delimiter=",") # ❌ 某格为空 → ValueError
# genfromtxt 更宽容:缺失的填 nan
data = np.genfromtxt("messy.csv", delimiter=",")
np.isnan(data).any() # True → 有缺失,处理掉(第 9 章)
genfromtxt 是 loadtxt 的加强版,缺数据不崩、自动转 nan,处理真实脏数据用它。
⚠️ 灵魂警告:allow_pickle 的安全问题
# 保存含 Python 对象(如字符串、dict)的数组:
np.save("objs.npy", np.array(["a", "b", "c"])) # 默认可能警告
# 新版 NumPy 默认不允许加载含对象的数组!
np.load("objs.npy") # ❌ ValueError: Object arrays cannot be loaded when allow_pickle=False
- 老版本 NumPy 保存的对象数组,新版本加载必须
np.load("objs.npy", allow_pickle=True) - ⚠️ 安全警告:
allow_pickle=True能执行文件里的任意代码——只加载你信任来源的文件(来自网络的 .npy 别开 pickle) - 最佳实践:纯数值数据用
.npy,别存对象数组;字符串/结构数据用 CSV 或 Pandas
选型建议
| 需求 | 用什么 | 特点 |
|---|---|---|
| 只给 Python / NumPy 用 | .npy |
最快、体积最小、原样还原 |
| 多个数组一起存 | .npz / .npz 压缩 |
一文件多数组 |
| 要给人看 / 跨工具交换 | .csv / .txt |
文本可读 |
| 缺数据的脏文本 | genfromtxt |
自动 nan |
小结
.npy:单个数组、二进制、加载最快,NumPy"亲儿子"格式.npz:多数组打包(savez_compressed可压缩).csv/.txt:savetxt/loadtxt,跨工具交换;脏数据用genfromtxt- ⚠️ 新版默认禁
allow_pickle,加载老文件要显式开启,且只信来源 - 纯数值数据优先
.npy,别为省事存对象数组
下一章:生成随机数(测试、抽样、模拟)。
上一篇:第 10 章 数组拼接与分割 | 下一篇:第 12 章 随机数
上一篇:第 10 章 数组拼接与分割 | 下一篇:第 12 章 随机数