scipy 1.0.0版本下如何保存CSR稀疏矩阵字典?save_npz报错求解
解决scipy 1.0.0中
save_npz保存稀疏矩阵字典报错的问题 你遇到的问题根源很明确:scipy 1.0.0版本的scipy.sparse.save_npz只能处理单个稀疏矩阵,不支持直接保存字典对象,这就是代码报错的核心原因。下面给你几个可行的解决方案,按操作简便性和兼容性排序:
方案1:用joblib直接保存字典(最简便)
joblib对包含scipy稀疏矩阵的复杂对象(比如字典)支持很好,不需要修改数据结构,操作步骤非常简单:
首先安装joblib(如果还没装):
pip install joblib
然后执行保存和加载操作:
from joblib import dump, load # 保存整个稀疏矩阵字典 dump(adj_mat_time_t, 'binary_adj_mats.joblib') # 后续需要使用时加载字典 adj_mat_time_t_loaded = load('binary_adj_mats.joblib')
这个方法兼容所有scipy版本(包括1.0.0),加载后直接得到原字典,不需要额外的格式转换。
方案2:拆分字典,逐个保存单个矩阵(无额外依赖)
如果不想安装新库,可以循环遍历字典的每个键值对,把每个CSR矩阵单独保存为npz文件:
import scipy.sparse as sp # 遍历字典,为每个矩阵生成独立的npz文件 for time_key, mat in adj_mat_time_t.items(): # 用字典键作为文件名的一部分,方便后续识别 sp.save_npz(f'binary_adj_mat_{time_key}.npz', mat)
需要使用时重新构建字典:
import os import scipy.sparse as sp adj_mat_time_t_loaded = {} # 遍历当前目录下所有符合命名规则的npz文件 for filename in os.listdir('.'): if filename.startswith('binary_adj_mat_') and filename.endswith('.npz'): # 提取原字典的键 time_key = filename.replace('binary_adj_mat_', '').replace('.npz', '') # 加载矩阵并加入新字典 adj_mat_time_t_loaded[time_key] = sp.load_npz(filename)
这个方法完全依赖scipy 1.0.0自带功能,不需要额外安装任何包。
方案3:用numpy.savez打包保存所有矩阵数据(无额外依赖)
如果你想把所有数据集中存到一个文件里,可以把每个CSR矩阵的核心属性(data、indices、indptr、shape)提取出来,用numpy的savez打包保存:
import numpy as np import scipy.sparse as sp # 准备保存的内容,存储每个矩阵的核心属性 save_contents = {} for time_key, mat in adj_mat_time_t.items(): save_contents[f'{time_key}_data'] = mat.data save_contents[f'{time_key}_indices'] = mat.indices save_contents[f'{time_key}_indptr'] = mat.indptr save_contents[f'{time_key}_shape'] = mat.shape # 打包保存到单个npz文件 np.savez('binary_adj_mats.npz', **save_contents)
加载时重建CSR矩阵字典:
import numpy as np import scipy.sparse as sp loaded_data = np.load('binary_adj_mats.npz') adj_mat_time_t_loaded = {} # 提取所有唯一的时间键 time_keys = set(key.split('_')[0] for key in loaded_data.keys() if '_data' in key) for time_key in time_keys: # 取出每个矩阵的属性 data = loaded_data[f'{time_key}_data'] indices = loaded_data[f'{time_key}_indices'] indptr = loaded_data[f'{time_key}_indptr'] shape = loaded_data[f'{time_key}_shape'] # 重建CSR矩阵 adj_mat_time_t_loaded[time_key] = sp.csr_matrix((data, indices, indptr), shape=shape)
这个方法也不需要额外依赖,所有数据集中存储,适合需要统一管理文件的场景。
内容的提问来源于stack exchange,提问作者StatsSorceress
相关产品推荐
相关产品推荐

