2014-02-16 2 views
0

행을 효율적으로 lil_matrix에 할당하는 방법은 무엇입니까? new_Qlil_matrix.getrow(x)lil_matrix에 행을 효율적으로 할당하십시오.

의 결과입니다

Q[mid, :] = new_Q 

내가 Q.getrow(i)Q[i, :] 사용에 대한 테스트를 실행하고, 전자는 빠른 20 배를 것으로 확인 : 저는 현재 사용하고 있습니다.

Here's the lil_matrix documentation.

+0

일반적으로 가능한 경우 LIL 형식을 사용하지 마십시오. 물론 유스 케이스에 대한 벤치마킹이 필요하지만 더 빠른 형식을 사용할 수있을 것으로 기대합니다. – perimosocordiae

+0

어떤 형식을 사용해야합니까? 저는 한 번에 한 행렬의 한 열만 수정하고 한 번에 한 행의 행렬을 수정합니다. 나는'csr_matrix'와'csc_matrix'를 고려했지만, 나는 CSR/CSC 행렬에 할당하는 것은 일반적으로 나쁜 생각이다. 이러한 포맷의 희박 구조를 바꾸려면 O (nnz) 연산이 필요하다. 기본적으로 처음부터 행렬을 재구성하는 것을 의미합니다. " –

+0

열이나 행을 수정하고 있습니까? 'lil'은 행에 유용합니다. 왜냐하면 각 행은 2 개의리스트에있는 간단한 엘리먼트로 표현되기 때문입니다. 특정 열을 사용하여 작업하면 많은 중첩 목록 내의 요소에 액세스해야합니다. – hpaulj

답변

0

작은 lil에이 시간 테스트 (밀도,하지만 난 문제라고 생각하지 않습니다)는 x[i,:] 문제 설정이 아닙니다 것이 좋습니다. 예, 어떤 이유로 행을 가져 오는 데 사용하면 속도가 느립니다. getrowview위한

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 

소스 이 매트릭스 내부 데이터 구조를 처리하는 방법을 나타내는, 유익하다.

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 

직접 수정주의 깊게 검사한다.