如何將一行有效地分配給lil_matrix
?我目前使用:向lil_matrix有效地分配一行
Q[mid, :] = new_Q
其中new_Q
是lil_matrix.getrow(x)
結果我跑使用Q.getrow(i)
對比Q[i, :]
測試,發現前者要快20倍。
Here's the lil_matrix
documentation.
如何將一行有效地分配給lil_matrix
?我目前使用:向lil_matrix有效地分配一行
Q[mid, :] = new_Q
其中new_Q
是lil_matrix.getrow(x)
結果我跑使用Q.getrow(i)
對比Q[i, :]
測試,發現前者要快20倍。
Here's the lil_matrix
documentation.
小lil
這些時間測試(密集,但我不認爲事情),建議x[i,:]
是沒有問題的設置。是的,出於某種原因,用於獲取行時速度很慢。
In [108]: x=sparse.lil_matrix(np.arange(120).reshape(24,5))
In [109]: timeit x[10,:]=10
1000 loops, best of 3: 235 us per loop
In [110]: timeit y=x.getrowview(10);y[:]=10
1000 loops, best of 3: 291 us per loop
In [111]: timeit x[10,:]
1000 loops, best of 3: 658 us per loop
In [112]: timeit x.getrowview(10)
10000 loops, best of 3: 51.4 us per loop
源爲getrowview
是有益的,示出了如何對這個矩陣的基礎數據結構進行處理。
def getrowview(self, i):
"""Returns a view of the 'i'th row (without copying).
"""
new = lil_matrix((1, self.shape[1]), dtype=self.dtype)
new.rows[0] = self.rows[i]
new.data[0] = self.data[i]
return new
我覺得x[10,:]
使用x.__getitem__
或x.__setitem__
。這兩個函數都比這個getrowview
更復雜。我猜x.__getitem__
是緩慢的,因爲它也在列索引(請參閱x._get1
)。 x[10,:]
所需時間與x[10,0:5]
一樣多。它讓你可以做些什麼的想法
In [133]: timeit x.rows[10]=range(5);x.data[10]=[10]*5
1000000 loops, best of 3: 1.36 us per loop
這是遠離一般,但:
什麼可能,如果你只需要設置行來完成,並獲得rows
和data
直接指示特別案例。
一些更多的時序:
In [156]: timeit x[10,:]=x.getrow(12)[:,:]
1000 loops, best of 3: 940 us per loop
In [157]: timeit x[10,:]=x.getrow(12)
1000 loops, best of 3: 259 us per loop
這額外[:,:]
緩慢。 getrow
已經返回一個副本,因此可能不需要。的rows
和data
需求
In [160]: timeit b=x.getrowview(10);b=x.getrow(12)
10000 loops, best of 3: 104 us per loop
In [169]: timeit x.rows[10],x.data[10] = x.rows[12][:],x.data[12][:]
1000000 loops, best of 3: 1.25 us per loop
直接修改進行仔細測試。
一般來說,我只是儘量避免使用LIL格式。當然,你需要爲你的用例進行基準測試,但我希望你可以使用更快的格式。 – perimosocordiae
我應該使用哪種格式?我一次只修改一列矩陣A,一次修改一列矩陣B.我認爲'csr_matrix'和'csc_matrix',但是我發現這個注意:「注意,分配給CSR/CSC矩陣通常是一個壞主意。對這些格式的稀疏結構的任何改變都需要O(nnz)操作,基本上意味着從頭開始重建矩陣。「 –
你在修改列或行嗎? 'lil'對行有好處,因爲每行都由2個列表中的簡單元素表示。使用特定列需要訪問許多嵌套列表中的元素。 – hpaulj