2017-07-02 146 views
1

在處理大型SciPy CSR稀疏矩陣時,我注意到對矩陣進行切片以從矩陣中獲取單行非常慢,因爲它似乎會進行復制。快速訪問的稀疏矩陣

有什麼辦法可以製作一個稀疏矩陣,而不是複製它的現有行的引用,也許有比CSR矩陣更適合的實現嗎?

我的實現需要快速查找元素和行,並快速查找矢量的所有非零索引。我從來不需要以任何方式改變矩陣或在矩陣上執行其他操作。

回答

0

你可以採取CSR表示的優點直接切片底層陣列和共享新的CSR矩陣中的數據:

mat = # some CSR matrix 
i = # the index of whatever row you want 
start, stop = mat.indptr[i], mat.indptr[i+1] 
noncopy_row_i = scipy.sparse.csr_matrix((mat.data[start:stop], 
             mat.indices[start:stop], 
             numpy.array([0, stop-start])), 
             shape=(1, mat.shape[1])) 
+0

我用'mat [我,:]'測試了你的函數。時序爲69.3μs×107μs,這是一個適度的改進。在「lil」格式上索引爲78μs。 – hpaulj

+0

如果你使用你的代碼只返回'data'和'indices',而不是構造一個新的'csr_matrix',它會快得多,大約2μs。提取'lil'格式的'row'元素時適用同樣的加速。 – hpaulj

+0

我決定這樣做,只使用索引而不構建新的csr_matrix。管理讓我的算法運行在10微秒左右,而不是總共1毫秒,這些優化已經夠好了,謝謝你們兩位! :-) – mahboi

0

numpy的支持不同類型的OS sparces矩陣:https://docs.scipy.org/doc/scipy/reference/sparse.html#usage-information

可能coo_matrix將提供更快速的元素查找,但是您也可以在其他操作中放棄。我認爲最好的方法是對你的數據和algorythms進行基準測試。

+0

'coo'格式不執行索引。 – hpaulj

+0

如果您需要非零元素,則有一個特殊的「非零」方法 - https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.coo_matrix.nonzero.html#scipy.sparse.coo_matrix.nonzero –

+0

稀疏的非零方法本質上返回'coo'格式的'row'和'col'屬性。檢查它的源代碼。 – hpaulj