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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:36:03