Python保存不同维度numpy数组列表的推荐方法 解决加载报错
你遇到的报错是因为直接将包含不同维度numpy数组的列表存入npz时,numpy会自动将列表转换为object类型数组存储,numpy默认加载时allow_pickle=False(规避反序列化安全风险),因此无法直接加载。以下是几种适配场景的存储方案,均支持单文件存储多组异构数据,类似MATLAB.mat文件的使用体验:
方案1:npz动态键存储(无额外依赖、无安全风险,最推荐普通场景使用)
不需要提前获知数组数量,直接将列表中的数组按序号生成动态键存入npz即可:
- 存储代码:
import numpy as np # 你的异构numpy数组列表 arr_list = [np.random.rand(2,3), np.random.rand(5), np.random.rand(4,4,2)] save_dict = {f'arr_{i}': arr for i, arr in enumerate(arr_list)} np.savez('multi_arr.npz', **save_dict)
- 加载代码:
loaded = np.load('multi_arr.npz') loaded_list = [loaded[f'arr_{i}'] for i in range(len(loaded.files))]
方案2:开启allow_pickle参数(仅适用于加载自身生成的可信文件)
如果你不想修改存储逻辑,只需要在加载时添加参数即可,注意不要用于加载来源不明的文件,避免恶意代码执行风险:
# 存储逻辑保持不变 np.savez('arr_list.npz', arr_list=arr_list) # 加载时添加allow_pickle参数 loaded = np.load('arr_list.npz', allow_pickle=True) loaded_list = loaded['arr_list'].tolist()
方案3:HDF5格式存储(适合大规模数据、结构化存储场景)
如果你的数据量较大,或者需要类似MATLAB struct的嵌套结构化存储能力,可以使用h5py操作HDF5格式文件,底层逻辑和高版本.mat文件完全兼容:
- 存储代码:
import h5py arr_list = [np.random.rand(2,3), np.random.rand(5), np.random.rand(4,4,2)] with h5py.File('data.h5', 'w') as f: # 存储数组列表 arr_group = f.create_group('arr_list') for i, arr in enumerate(arr_list): arr_group.create_dataset(f'arr_{i}', data=arr) # 支持额外存储属性、其他数组,和MATLAB struct使用逻辑一致 f.attrs['data_desc'] = '异构数组集合' f.create_dataset('other_mat', data=np.random.rand(3,3))
- 加载代码:
with h5py.File('data.h5', 'r') as f: loaded_list = [f['arr_list'][f'arr_{i}'][()] for i in range(len(f['arr_list']))] other_mat = f['other_mat'][()] desc = f.attrs['data_desc']
方案4:joblib存储(适合混合存储numpy数组与普通Python对象)
如果你需要同时存储numpy数组和其他Python对象(比如字典、列表、自定义类实例),可以使用joblib,接口非常简洁:
import joblib # 存储 joblib.dump(arr_list, 'arr_list.joblib') # 加载 loaded_list = joblib.load('arr_list.joblib')
内容的提问来源于stack exchange,提问作者secondrate
相关产品推荐
相关产品推荐

