python中的密集矩阵与稀疏矩阵

时间:2020-11-11 10:45:31

标签: python performance matrix sparse-matrix

我正在用python比较一行矩阵的读取时间,首先以密集格式,然后以稀疏格式获取。

从密集矩阵中“提取”一行的时间约为3.6e-05秒

对于稀疏格式,我同时尝试了csr_mtrix和lil_matrix,但是对于行读取而言,它们都花费了大约1-e04秒

我希望稀疏格式能提供最佳性能,任何人都可以帮助我理解这一点吗?

1 个答案:

答案 0 :(得分:2)

arr[i,:]对于密集数组会生成view,因此其执行时间与arr.shape无关。如果您不了解viewcopy之间的区别,则需要更多了解numpy基础知识。

csrlil格式允许索引看起来很像ndarray's,但有一些关键区别。在大多数情况下,view的概念不适用。有一个例外。 M.getrowview(i)利用lil的唯一数据结构来产生view。 (阅读其文档和代码)

某些csr格式的索引实际上是通过特殊构造的“提取器”矩阵使用矩阵乘法的。

在所有稀疏索引生成稀疏矩阵的情况下,实际上从数据构造新矩阵都需要时间。稀疏使用的编译代码几乎不及numpy。与numpy相比,它的强项是稀疏10%(或更小)的矩阵的矩阵乘法。

在最简单的格式(易于理解)coo中,每个非零元素都由3个值表示:数据,行,列。这些存储在3个1d数组中。因此,它必须具有小于30%的稀疏性,才能在内存使用方面达到收支平衡。 coo未实现索引编制。