本系列是《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

小结

  1. .npy:单个数组、二进制、加载最快,NumPy"亲儿子"格式
  2. .npz:多数组打包(savez_compressed 可压缩)
  3. .csv/.txt:savetxt/loadtxt,跨工具交换;脏数据用 genfromtxt
  4. ⚠️ 新版默认禁 allow_pickle,加载老文件要显式开启,且只信来源
  5. 纯数值数据优先 .npy,别为省事存对象数组

下一章:生成随机数(测试、抽样、模拟)。


上一篇:第 10 章 数组拼接与分割 | 下一篇:第 12 章 随机数


上一篇:第 10 章 数组拼接与分割 | 下一篇:第 12 章 随机数