了解 scipy 稀疏矩阵类型

数据挖掘 Python scipy
2021-10-01 06:26:34

我正在尝试选择要在我的算法中使用的最佳 scipy 稀疏矩阵类型。在那,我应该以 vij 方式初始化数据,然后我应该用它来执行矩阵向量乘法。最终我必须添加行和列。试图为我的问题选择最好的,我想了解使用每种类型的最佳情况:lil_matrix、coo_matrix、csr_matrix、csc_matrix、dok_matrix。有人可以解释一下吗?没有必要在同一个答案中显示所有类型的示例。

2个回答

好的,我一直在寻找答案,现在我更清楚了:Scipy 文档没有详细说明解释,但维基百科的文章更加清晰。对于那些正在寻找答案的人,有两大类稀疏矩阵:

a) 用于构造矩阵的稀疏类型:

  • DOK (Dictionary Of Keys):将(行、列)映射到元素值的字典。它使用哈希表,因此设置元素很有效。

  • LIL(列表列表):LIL 每行存储一个列表。lil_matrix 格式是基于行的,所以如果我们想在其他操作中使用它,转换为 CSR 是有效的,而转换为 CSC 则不太有效。

  • COO(COOrdinate list):存储(行、列、值)元组的列表。

b) 支持高效访问、算术运算、列或行切片以及矩阵向量乘积的稀疏类型:

  • CSR(压缩稀疏行):类似于 COO,但压缩行索引。以从左到右从上到下(“行优先”)的顺序保存 M 的所有非零条目(第一行中的所有元素,第二行中的所有元素,依此类推)。索引和切片效率更高,因为同一行中的元素连续存储在内存中。

  • CSC(压缩稀疏列):与 CSR 类似,只是首先按列读取值。在列索引和切片中更有效。

使用 a) 类型之一构建矩阵后,要执行乘法或求逆等操作,我们应该将矩阵转换为 CSC 或 CSR 格式。

如果您希望一个易于理解的实现有机会使矩阵更大并且能够进行行/列操作,我建议您coo_matrixcoo_matrix 构造起来高效且快速,但算术运算在此矩阵上效率不高。相反,您可以轻松地将 coo_matrix 转换为在column_slicing/row_slicing中有效的 csc_matrix/csr_matrix,这样您就可以进行高效的乘法或求逆。