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())

⚠️ 重要注意事项

  1. np.savez 不会压缩数据(只是打包多个 npy);想要压缩用 np.savez_compressed,用法一模一样,文件更小,读写略慢一点
np.savez_compressed("compress.npz", a=a,b=b)
  1. 不能追加写入! 每次调用np.savez都会覆盖旧文件。

如果想新增数组,只能:读取全部 → 添加新数组 → 重新 savez

  1. 读取后的 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 打包 + 压缩,文件更小,读写稍慢

 

posted @ 2026-10-21 11:06  emanlee  阅读(4)  评论(0)    收藏  举报