scipy.sparse.lil_matrix调用tocoo()报维度错误问题求解
问题原因及修复方案
核心原因
你手动为lil_matrix的rows、data属性赋值时,传入的preds_k维度不符合当前环境scipy版本的格式要求:
lil_matrix的rows属性要求为「长度等于矩阵行数的列表,列表的每个元素是存储当前行非零元素列索引的一维序列」- 你使用的
preds_k是二维numpy数组(常见于topK预测结果输出,shape为(行数, K)),直接赋值给rows属性后,低版本scipy在执行tocoo()转换时,会检测到每行索引的维度不符合预期,抛出维度错误。 - Google Colab环境默认搭载的scipy版本更高,内部对二维序列输入做了自动兼容处理,因此不会报错。
修复代码
赋值前先将preds_k的每行转为一维列表即可:
import scipy.sparse import numpy as np x = scipy.sparse.lil_matrix(y.shape) # 逐行处理为符合要求的一维结构 x.rows = [row.ravel().tolist() for row in preds_k] x.data = [np.ones(len(row), dtype=np.float64).tolist() for row in preds_k] # 也可以使用更稳妥的索引赋值写法,避免手动修改内部属性 for row_idx in range(preds_k.shape[0]): x[row_idx, preds_k[row_idx].ravel()] = 1
结构差异验证
你可以执行以下代码确认问题根源:
# 查看正常y的rows属性结构 print("y.rows子元素维度:", np.array(y.rows[0]).ndim) # 查看你赋值的x.rows属性结构 print("x.rows子元素维度:", np.array(x.rows[0]).ndim)
正常情况下y.rows的子元素维度为1,你直接赋值后的x.rows子元素维度为2,就是报错的直接诱因。
内容的提问来源于stack exchange,提问作者hml
相关产品推荐
相关产品推荐

