2017-02-09 266 views
0

我有一个scipy sparse CSR矩阵的大小2M x 50k与200M非零值(100每行)。我需要通过一个(随机分布的)索引(它是一个熊猫Series)对它的120k行进行切片,然后将该子矩阵乘以大小为1x50k的稀疏向量(也有100个非零值)。SciPy稀疏CSR矩阵的快速切片和乘法

我这样做:

slice = matrix[index.tolist(), :] 
result = slice.dot(vector.T).T.toarray()[0] # returns 1x120k array 

纵切需要0.7s(慢),然后乘采取0.05s

相反,我可以先乘以整个矩阵,然后切片结果:

result = matrix.dot(vector.T).T.toarray()[0] 
result_sliced = result[index.tolist()] # returns 1x120k array 

在这种情况下,乘法需要0.65s然后切片需要0.015s

问题:

  1. 为什么是行的CSR矩阵的切片这么慢?即使整个矩阵的乘法所花费的时间也比它少。

  2. 有没有办法来实现最终的结果更快?

回答

1

我在Sparse matrix slicing using list of int中解释过,这种行索引实际上是用矩阵乘法执行的。实际上,它构造了一个稀疏向量,其中1为所需的行,并执行相应的dot

所以我并不感到惊讶的是,操作的顺序并不重要。

一般来说,稀疏矩阵不适用于高效索引。例如,他们不会返回视图。矩阵乘法是其最有效的操作之一。即使是行或列总和也是用矩阵乘法执行的。

+0

有没有办法实现最终结果更快? –