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

使用sksparse.cholmod分解CSC稀疏矩阵时触发AssertionError求助

问题:使用cholmod分解CSC稀疏矩阵时触发AssertionError

问题复现

尝试用cholmod分解CSC格式大型稀疏矩阵时遇到AssertionError,简化示例代码如下:

import numpy as np
from scipy.sparse import coo_array
from sksparse.cholmod import cholesky

row = np.array([0, 1])
col = np.array([0, 1])
val = np.array([1., 1.])

A = coo_array((val, (row, col)), shape=(2, 2)).tocsc()

factor = cholesky(A)

运行后报错:

/tmp/ipykernel_59957/2822312894.py:12: CholmodTypeConversionWarning: converting matrix of class csc_array to CSC format
  factor = cholesky(A)

---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
Cell In[17], line 12
      7 val = np.array([1., 1.])
     10 A = coo_array((val, (row, col)), shape=(2, 2)).tocsc()
---> 12 factor = cholesky(A)

File sksparse/cholmod.pyx:1189, in sksparse.cholmod.cholesky()

File sksparse/cholmod.pyx:1216, in sksparse.cholmod._cholesky()

File sksparse/cholmod.pyx:1126, in sksparse.cholmod._analyze()

File sksparse/cholmod.pyx:411, in sksparse.cholmod._check_for_csc()

AssertionError: 

另外,用稠密矩阵转csc_matrix的方式可以正常运行,但对大型稀疏矩阵效率极低:

import scipy.sparse as scsp
factor = cholesky(scsp.csc_matrix(np.array([[ 1., 0.],
       [0.,  1.]]), dtype=np.float64))

原因分析

sksparse.cholmod的cholesky函数仅兼容Scipy旧版的csc_matrix类,不支持Scipy 1.7+引入的新版数组风格稀疏矩阵类csc_array。你通过coo_array.tocsc()得到的是csc_array对象,而非csc_matrix,这就是触发断言错误的核心原因,警告信息里的"converting matrix of class csc_array to CSC format"也侧面验证了这一点。

解决方案

方案1:直接使用csc_matrix构造矩阵

避免使用coo_array,改用coo_matrix构造后转CSC格式,全程使用旧版稀疏矩阵类:

import numpy as np
from scipy.sparse import coo_matrix
from sksparse.cholmod import cholesky

row = np.array([0, 1])
col = np.array([0, 1])
val = np.array([1., 1.])

A = coo_matrix((val, (row, col)), shape=(2, 2)).tocsc()
factor = cholesky(A)

方案2:将csc_array转换为csc_matrix

如果已经持有csc_array对象,直接转换为csc_matrix即可,这个转换是轻量级操作,不会产生稠密矩阵转换那样的性能损耗:

import numpy as np
from scipy.sparse import coo_array, csc_matrix
from sksparse.cholmod import cholesky

row = np.array([0, 1])
col = np.array([0, 1])
val = np.array([1., 1.])

A_array = coo_array((val, (row, col)), shape=(2, 2)).tocsc()
A_matrix = csc_matrix(A_array)
factor = cholesky(A_matrix)

内容的提问来源于stack exchange,提问作者Harry van Langen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 03:17:06