2017-02-09 271 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

有沒有辦法實現最終結果更快? –