我正在用python比较一行矩阵的读取时间,首先以密集格式,然后以稀疏格式获取。
从密集矩阵中“提取”一行的时间约为3.6e-05秒
对于稀疏格式,我同时尝试了csr_mtrix和lil_matrix,但是对于行读取而言,它们都花费了大约1-e04秒
我希望稀疏格式能提供最佳性能,任何人都可以帮助我理解这一点吗?
答案 0 :(得分:2)
arr[i,:]
对于密集数组会生成view
,因此其执行时间与arr.shape
无关。如果您不了解view
和copy
之间的区别,则需要更多了解numpy
基础知识。
csr
和lil
格式允许索引看起来很像ndarray's
,但有一些关键区别。在大多数情况下,view
的概念不适用。有一个例外。 M.getrowview(i)
利用lil
的唯一数据结构来产生view
。 (阅读其文档和代码)
某些csr
格式的索引实际上是通过特殊构造的“提取器”矩阵使用矩阵乘法的。
在所有稀疏索引生成稀疏矩阵的情况下,实际上从数据构造新矩阵都需要时间。稀疏使用的编译代码几乎不及numpy
。与numpy
相比,它的强项是稀疏10%(或更小)的矩阵的矩阵乘法。
在最简单的格式(易于理解)coo
中,每个非零元素都由3个值表示:数据,行,列。这些存储在3个1d数组中。因此,它必须具有小于30%的稀疏性,才能在内存使用方面达到收支平衡。 coo
未实现索引编制。