Python SciPy稀疏矩阵切片报NotImplementedError,如何访问矩阵元素?
报错原因
sparse.kronsum生成的矩阵默认是 BSR(块稀疏行矩阵) 格式,该格式未实现列维度切片[:,i:i+1]的索引逻辑,因此直接调用会抛出NotImplementedError。
解决方案
- 方案1:转为支持完整索引的稀疏格式
优先转为CSC(适合列操作)或CSR格式,后续即可正常使用切片语法:# 生成矩阵时直接转格式 A = sparse.kronsum(B,B).tocsc() # 原有代码可直接运行 A[:,i:i+1].toarray().flatten() - 方案2:调用稀疏矩阵通用
getcol接口(无需提前转格式,效率更高)
如果仅需要获取单i列的所有元素,直接调用所有稀疏格式都支持的getcol方法即可:res = A.getcol(i).toarray().flatten() - 方案3:仅需获取单个位置元素的话,直接用坐标索引即可:
val = A[行索引, 列索引]
可运行测试示例
from scipy import sparse import numpy as np diagonals = [[2] * 3, [-1] * (3-1), [-1] * (3-1)] offsets = [0, 1, -1] B = sparse.diags(diagonals, offsets) A = sparse.kronsum(B,B) i = 2 # 两种方案结果一致 res1 = A.tocsc()[:,i:i+1].toarray().flatten() res2 = A.getcol(i).toarray().flatten() print(np.allclose(res1, res2)) # 输出:True
内容的提问来源于stack exchange,提问作者Maximilian
相关产品推荐
相关产品推荐

