如何将字典格式稀疏矩阵转换为numpy的csr_matrix格式
报错原因
你遇到的报错是因为scipy.sparse.csr_matrix(注意:CSR矩阵属于scipy的稀疏矩阵模块,不是numpy原生类型)不直接支持以(行索引, 列索引)为键的字典作为输入。直接传入字典时,scipy会将其识别为object类型的普通对象,无法解析为稀疏矩阵结构,因此抛出TypeError: no supported conversion for types: (dtype('O'),)错误。
正确转换方法
有两种常用的转换方案可选:
方案1:拆分字典直接构造CSR矩阵
你的字典结构已经包含了所有非零元素的坐标与值,只需要拆分为行索引数组、列索引数组、数值数组三个部分,再传入构造即可:
from scipy.sparse import csr_matrix # 拆分字典得到三个序列 rows, cols, data = zip(*[(r, c, v) for (r, c), v in sparse_mat.items()]) # 计算矩阵总行列数,也可根据实际业务需求手动指定 n_rows = max(rows) + 1 n_cols = max(cols) + 1 # 构造CSR矩阵 csr_mat = csr_matrix((data, (rows, cols)), shape=(n_rows, n_cols))
方案2:通过DOK矩阵中转
DOK(Dictionary Of Keys)是scipy稀疏矩阵的一种存储格式,天生就是以(行,列)元组为键、值为对应元素值的字典结构,完全匹配你现有的字典格式,可以直接转换:
from scipy.sparse import dok_matrix, csr_matrix # 计算矩阵总行列数 n_rows = max(k[0] for k in sparse_mat.keys()) + 1 n_cols = max(k[1] for k in sparse_mat.keys()) + 1 # 初始化DOK矩阵并导入数据 dok_mat = dok_matrix((n_rows, n_cols)) dok_mat.update(sparse_mat) # 转换为CSR格式 csr_mat = dok_mat.tocsr()
转换完成后可以调用csr_mat.toarray()生成稠密矩阵,验证转换结果是否符合预期。
内容的提问来源于stack exchange,提问作者muds
相关产品推荐
相关产品推荐

