如何将包含numpy数组的Python字典保存到文件并还原原格式
嘿,这个问题我之前处理大numpy数组的时候也碰到过!给你几个亲测有效的方案,都能完美保留numpy数组类型,而且不用手动遍历数组:
方案1:使用Python原生的pickle模块
pickle是Python自带的序列化工具,能直接把包含numpy数组的整个字典保存下来,完全保留原有的数据类型,操作也超简单。
import pickle import numpy as np # 模拟你的目标字典(300维大数组) my_dict = {"big_300d_array": np.random.rand(10000, 300)} # 保存到文件(二进制模式) with open("saved_dict.pkl", "wb") as f: pickle.dump(my_dict, f) # 从文件加载回字典 with open("saved_dict.pkl", "rb") as f: loaded_dict = pickle.load(f) # 验证:检查数组类型和内容是否一致 print(type(loaded_dict["big_300d_array"])) # 输出 <class 'numpy.ndarray'> print(np.array_equal(my_dict["big_300d_array"], loaded_dict["big_300d_array"])) # 输出 True
优点:无需额外安装依赖,直接序列化整个对象,不用处理数组的任何细节;注意点:pickle文件是二进制不可读的,且不同Python版本间可能存在兼容性问题,但你已经说明不在意可读性,所以完全没问题。
方案2:使用numpy自带的savez_compressed
如果你的字典里全是numpy数组(像你描述的这样),numpy的savez_compressed是个绝佳选择——它不仅能保存多个数组,还会自动压缩文件,节省磁盘空间,而且完全保留numpy数组类型。
import numpy as np my_dict = {"big_300d_array": np.random.rand(10000, 300)} # 用**把字典拆成键值对传入,自动以键作为数组名 np.savez_compressed("saved_dict.npz", **my_dict) # 加载文件并转回字典 loaded_npz = np.load("saved_dict.npz") loaded_dict = {key: loaded_npz[key] for key in loaded_npz} # 验证 print(type(loaded_dict["big_300d_array"])) print(np.array_equal(my_dict["big_300d_array"], loaded_dict["big_300d_array"]))
优点:numpy原生支持,压缩效果好,加载速度快;注意点:只适用于字典值全是numpy数组的情况,如果以后字典里加了其他类型的数据,这个方法就不适用了。
方案3:使用joblib(针对超大数组更高效)
joblib是专门为处理大numpy数组设计的序列化工具,比pickle在大数据场景下速度更快、压缩比更高,很多机器学习项目里都会用它来保存模型或大数组。
首先需要安装joblib:
pip install joblib
然后使用代码:
from joblib import dump, load import numpy as np my_dict = {"big_300d_array": np.random.rand(10000, 300)} # 保存字典 dump(my_dict, "saved_dict.joblib") # 加载字典 loaded_dict = load("saved_dict.joblib") # 验证 print(type(loaded_dict["big_300d_array"])) print(np.array_equal(my_dict["big_300d_array"], loaded_dict["big_300d_array"]))
优点:对超大numpy数组的序列化/反序列化效率极高,压缩效果优秀;注意点:需要额外安装依赖,但安装过程非常简单。
内容的提问来源于stack exchange,提问作者stackoverflower
相关产品推荐
相关产品推荐

