在處理大型SciPy CSR稀疏矩陣時,我注意到對矩陣進行切片以從矩陣中獲取單行非常慢,因爲它似乎會進行復制。快速訪問的稀疏矩陣
有什麼辦法可以製作一個稀疏矩陣,而不是複製它的現有行的引用,也許有比CSR矩陣更適合的實現嗎?
我的實現需要快速查找元素和行,並快速查找矢量的所有非零索引。我從來不需要以任何方式改變矩陣或在矩陣上執行其他操作。
在處理大型SciPy CSR稀疏矩陣時,我注意到對矩陣進行切片以從矩陣中獲取單行非常慢,因爲它似乎會進行復制。快速訪問的稀疏矩陣
有什麼辦法可以製作一個稀疏矩陣,而不是複製它的現有行的引用,也許有比CSR矩陣更適合的實現嗎?
我的實現需要快速查找元素和行,並快速查找矢量的所有非零索引。我從來不需要以任何方式改變矩陣或在矩陣上執行其他操作。
你可以採取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]))
numpy的支持不同類型的OS sparces矩陣:https://docs.scipy.org/doc/scipy/reference/sparse.html#usage-information
可能coo_matrix
將提供更快速的元素查找,但是您也可以在其他操作中放棄。我認爲最好的方法是對你的數據和algorythms進行基準測試。
我用'mat [我,:]'測試了你的函數。時序爲69.3μs×107μs,這是一個適度的改進。在「lil」格式上索引爲78μs。 – hpaulj
如果你使用你的代碼只返回'data'和'indices',而不是構造一個新的'csr_matrix',它會快得多,大約2μs。提取'lil'格式的'row'元素時適用同樣的加速。 – hpaulj
我決定這樣做,只使用索引而不構建新的csr_matrix。管理讓我的算法運行在10微秒左右,而不是總共1毫秒,這些優化已經夠好了,謝謝你們兩位! :-) – mahboi