Scipy.sparse:csc_matrix、csr_matrix与csc_array的使用场景及差异咨询
Scipy稀疏矩阵常见问题解答
1. 何时使用csc_matrix和csr_matrix?它们与_array、_matrix系列有何区别?
- csr_matrix(行压缩稀疏矩阵):适合以行操作为主的场景,比如行切片、矩阵左乘向量(
A @ x)、行求和/求均值等。存储时按行的非零元素顺序存储,对行相关的遍历和计算效率更高。 - csc_matrix(列压缩稀疏矩阵):适合以列操作为主的场景,比如列切片、向量右乘矩阵(
x @ A)、列求和/求均值等。存储时按列的非零元素顺序存储,列相关操作速度更快。
关于_array与_matrix的区别:
_matrix系列(如csr_matrix、csc_matrix)是旧版稀疏矩阵类,继承自numpy.matrix,行为更贴近传统矩阵运算(比如*运算符默认是矩阵乘法,而非元素级乘法),属于Scipy的遗留接口。_array系列(如csr_array、csc_array)是新版稀疏数组类,继承自numpy.ndarray,完全贴合NumPy数组的操作习惯(*是元素级乘法,@是矩阵乘法),支持更多NumPy通用函数(ufuncs),内存效率和生态兼容性更优,是官方推荐的优先选择。
2. 对角矩阵行数多于列数时,用csc_matrix更高效?列数更多时选csr_matrix?
首先,对角矩阵本身最适合用dia_matrix(对角稀疏矩阵)存储,因为它只存储对角线的非零元素,空间开销最小,对角相关操作的效率也最高。
如果非要在csr_matrix和csc_matrix中选择,核心判断依据不是行/列的数量,而是后续的操作类型:
- 若需要频繁做列相关操作(比如提取列、列求和),哪怕行数远多于列数,
csc_matrix的效率依然更高; - 若需要频繁做行相关操作(比如提取行、行求和),哪怕列数远多于行数,
csr_matrix更合适。
单纯的行/列数量差异不会直接决定两者的效率,操作类型才是关键。
3. csc_matrix与csc_array的主要区别是什么?
- 继承关系与接口风格:
csc_matrix继承自numpy.matrix,遵循传统矩阵的运算规则(如*为矩阵乘法);csc_array继承自numpy.ndarray,完全对齐NumPy数组的操作逻辑(*为元素级乘法,@为矩阵乘法)。 - 生态兼容性:
csc_array支持更多NumPy的通用函数(如np.sin、np.exp等直接作用于稀疏数组),而csc_matrix对这类函数的支持有限,往往需要额外转换。 - 官方优先级:
csc_array是Scipy后续重点维护的新版接口,csc_matrix属于遗留类,仅为兼容旧代码保留,新项目建议优先使用csc_array。
内容的提问来源于stack exchange,提问作者THATS MY QUANT MY QUANTITATIVE
相关产品推荐
相关产品推荐

