使用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
相关产品推荐
相关产品推荐

