<p>稀疏矩阵包和MATLAB中类似的包基于线性代数问题的思想,例如求解大型稀疏线性方程(例如,有限差分和有限元实现)。因此,矩阵积(numpy数组的<code>dot</code>积)和方程求解器等都得到了很好的开发。</p>
<p>我的粗略经验是,稀疏矩阵乘积必须具有1%的稀疏性,才能比等效的密集运算更快,换句话说,每99个零对应一个非零值。(但见下面的测试)</p>
<p>但是人们也尝试使用稀疏矩阵来节省内存。但请记住,这样的矩阵必须存储3个值数组(至少是<code>coo</code>格式)。所以稀疏度必须小于1/3才能开始节省内存。显然,如果首先构建密集数组,然后从中创建稀疏数组,就不会节省内存。</p>
<p><code>scipy</code>包实现了许多稀疏格式。<code>coo</code>格式最容易理解和构建。根据文档构建一个并查看其<code>.data</code>、<code>.row</code>和<code>.col</code>属性(3个1d数组)。</p>
<p><code>csr</code>和<code>csc</code>通常是根据<code>coo</code>格式构建的,并将数据压缩一点,使它们更难理解。但是他们有大部分的数学功能。</p>
<p>索引<code>csr</code>格式也是可能的,尽管通常这比等效的密集矩阵/数组情况慢。其他操作,如改变值(特别是从0到非零)、连接、增量增长,也比较慢。</p>
<p><code>lil</code>(列表列表)也很容易理解,最适合增量构建。<code>dok</code>实际上是一个字典子类。</p>
<p>一个关键点是稀疏矩阵仅限于2d,并且在许多方面表现得像<code>np.matrix</code>类(尽管它不是子类)。</p>
<p>使用<code>scikit-learn</code>和<code>sparse</code>搜索其他问题可能是找到使用这些矩阵的优缺点的最佳方法。我已经回答了很多问题,但我更了解“稀疏”的一面,而不是“学习”的一面。我认为它们很有用,但我的感觉是,合身并不总是最好的。任何定制都在<code>learn</code>端。到目前为止,<code>sparse</code>包尚未为此应用程序进行优化。</p>
<hr/>
<p>我刚刚尝试了一些矩阵乘积测试,使用<code>sparse.random</code>方法创建具有指定稀疏性的稀疏矩阵。稀疏矩阵乘法的性能比我预期的要好。</p>
<pre><code>In [251]: M=sparse.random(1000,1000,.5)
In [252]: timeit M1=M*M
1 loops, best of 3: 2.78 s per loop
In [253]: timeit Ma=M.toarray(); M2=Ma.dot(Ma)
1 loops, best of 3: 4.28 s per loop
</code></pre>
<p>这是一个大小问题;对于较小的矩阵,密集的<code>dot</code>更快</p>
<pre><code>In [255]: M=sparse.random(100,100,.5)
In [256]: timeit M1=M*M
100 loops, best of 3: 3.24 ms per loop
In [257]: timeit Ma=M.toarray(); M2=Ma.dot(Ma)
1000 loops, best of 3: 1.44 ms per loop
</code></pre>
<p>但是比较索引</p>
<pre><code>In [268]: timeit M.tocsr()[500,500]
10 loops, best of 3: 86.4 ms per loop
In [269]: timeit Ma[500,500]
1000000 loops, best of 3: 318 ns per loop
In [270]: timeit Ma=M.toarray();Ma[500,500]
10 loops, best of 3: 23.6 ms per loop
</code></pre>