2014-02-16 55 views
0

如何將一行有效地分配給lil_matrix?我目前使用:向lil_matrix有效地分配一行

Q[mid, :] = new_Q 

其中new_Qlil_matrix.getrow(x)

結果我跑使用Q.getrow(i)對比Q[i, :]測試,發現前者要快20倍。

Here's the lil_matrix documentation.

+0

一般來說,我只是儘量避免使用LIL格式。當然,你需要爲你的用例進行基準測試,但我希望你可以使用更快的格式。 – perimosocordiae

+0

我應該使用哪種格式?我一次只修改一列矩陣A,一次修改一列矩陣B.我認爲'csr_matrix'和'csc_matrix',但是我發現這個注意:「注意,分配給CSR/CSC矩陣通常是一個壞主意。對這些格式的稀疏結構的任何改變都需要O(nnz)操作,基本上意味着從頭開始重建矩陣。「 –

+0

你在修改列或行嗎? 'lil'對行有好處,因爲每行都由2個列表中的簡單元素表示。使用特定列需要訪問許多嵌套列表中的元素。 – hpaulj

回答

0

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 

這是遠離一般,但:

什麼可能,如果你只需要設置行來完成,並獲得rowsdata直接指示特別案例。


一些更多的時序:

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已經返回一個副本,因此可能不需要。的rowsdata需求

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 

直接修改進行仔細測試。