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

SciPy 1.16 CSC矩阵.multiply()生成indptr尺寸错误的无效矩阵问题

SciPy 1.16中CSC矩阵.multiply()方法的indptr格式bug及修复方案

问题概述

将SciPy从1.15版本升级至1.16后,使用CSC矩阵调用.multiply()执行元素级乘法时,会生成indptr数组尺寸不符合规范的无效矩阵。CSC格式的核心约束为len(indptr) == 列数+1,该bug导致结果矩阵的indptr长度不满足此要求,进而破坏矩阵重建、存储加载等依赖格式约束的下游操作。1.15及更早版本无此问题。

最小复现示例

import scipy.sparse as sp

# 构造两个测试用CSC矩阵
A = sp.csc_matrix([[1, 0, 2], [0, 3, 0], [4, 0, 5]])
B = sp.csc_matrix([[0, 1, 0], [2, 0, 3], [0, 4, 0]])

# 执行元素级乘法
C = A.multiply(B)

# 验证CSC格式约束是否被破坏
print(f"结果矩阵列数: {C.shape[1]}")
print(f"indptr数组长度: {len(C.indptr)}")
print(f"符合CSC格式约束: {len(C.indptr) == C.shape[1] + 1}")

计算结果验证

虽然生成的矩阵格式无效,但元素级乘法的计算逻辑是正确的,结果与密集矩阵计算一致:

# 对比密集矩阵与稀疏矩阵的计算结果
print("密集矩阵元素乘法结果:")
print(A.toarray() * B.toarray())
print("\n稀疏矩阵乘法结果(转密集后):")
print(C.toarray())

临时修复方案

通过将无效矩阵先转换为COO格式,再转回CSC格式,可以修复indptr数组的尺寸问题:

# 修复格式无效的CSC矩阵
C_fixed = C.tocoo().tocsc()

# 验证修复后的格式约束
print(f"修复后indptr数组长度: {len(C_fixed.indptr)}")
print(f"修复后符合CSC约束: {len(C_fixed.indptr) == C_fixed.shape[1] + 1}")

内容的提问来源于stack exchange,提问作者mattjvincent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:44:55