NumPy np.savez 示例讲解
np.savez 示例讲解
np.savez:把多个 numpy 数组保存到一个 .npz 压缩包(zip 格式) 语法:
np.savez(文件名, 数组1, 数组2, key1=数组A, key2=数组B)
规则:
- 不写
key=的数组:自动命名arr_0, arr_1, arr_2 … key=数组:手动自定义名字,读取用这个 key 取数组.npz用np.load()打开,返回类似字典对象,用[key]取出数组
示例 1:基础用法(混合自动命名 + 自定义 key)
import numpy as np
a = np.array([1,2,3,4])
b = np.array([[10,20],[30,40]])
c = np.arange(12).reshape(2,2,3) #三维数组
# 保存:a自动arr_0;b自动arr_1;c指定名字叫"three_d"
np.savez("test1.npz", a, b, three_d=c)
# 读取
data = np.load("test1.npz")
# 查看所有key
print(data.keys())
# dict_keys(['arr_0', 'arr_1', 'three_d'])
# 取出数组
arr_a = data["arr_0"]
arr_b = data["arr_1"]
arr_c = data["three_d"]
print("arr_0:\n", arr_a)
print("three_d:\n", arr_c)
示例 2:全部手动指定 key(推荐,可读性最好)
工程代码推荐全部写 key,不要依赖 arr_0,避免顺序混乱
import numpy as np
x = np.linspace(0,1,10)
y = np.random.rand(5,5)
# 全部自定义key
np.savez("test2.npz", x_data=x, y_data=y)
res = np.load("test2.npz")
print(res.keys()) # dict_keys(['x_data', 'y_data'])
print(res["x_data"])
print(res["y_data"].shape)
示例 3:保存数组 + 标量、字符串(小技巧)
np.savez 不仅可以存 ndarray,普通数字 / 字符串会自动转为数组:
import numpy as np
params = {"lr":0.01, "name":"exp1"}
arr = np.arange(6)
np.savez("test3.npz",
array_data=arr,
learning_rate=0.01,
exp_name="experiment_01")
out = np.load("test3.npz", allow_pickle=True)
print(out.keys())
print(out["learning_rate"])
print(out["exp_name"])
注意:如果保存字典对象,需要加
allow_pickle=True;尽量少用 pickle,有安全风险,优先只存纯数值数组。
示例 4:循环批量保存多个数组(列表里的数组)
如果数组放在列表里,用**解包:
import numpy as np
arr_list = [
("img1", np.ones((3,3))),
("img2", np.zeros((2,4))),
("img3", np.eye(4))
]
# 把列表转成 {key:array}字典,**解包传入savez
dict_data = {name:arr for name,arr in arr_list}
np.savez("test4.npz",**dict_data)
rd = np.load("test4.npz")
print(rd.keys())
⚠️ 重要注意事项
- np.savez 不会压缩数据(只是打包多个 npy);想要压缩用
np.savez_compressed,用法一模一样,文件更小,读写略慢一点
np.savez_compressed("compress.npz", a=a,b=b)
- 不能追加写入! 每次调用
np.savez都会覆盖旧文件。
如果想新增数组,只能:读取全部 → 添加新数组 → 重新 savez
- 读取后的 NpzFile 对象,用完最好 close,防止文件句柄泄露
data = np.load("test1.npz")
# 操作
data.close()
# 或者with上下文写法(推荐)
with np.load("test1.npz") as f:
print(f["arr_0"])
✅ np.savez vs np.savez_compressed
表格
| 函数 | 作用 |
|---|---|
np.savez |
打包多个 npy,不压缩,读写快,文件大 |
np.savez_compressed |
打包 + 压缩,文件更小,读写稍慢 |

浙公网安备 33010602011771号