You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:11:10