작은 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
이 지금까지 일반적에서이다, 그러나 당신이 할 수있는 일의 아이디어를 제공합니다 : 당신은 단지 하나 개의 행을 설정해야하는 경우 수행, 직접 액세스 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
어떤 형식을 사용해야합니까? 저는 한 번에 한 행렬의 한 열만 수정하고 한 번에 한 행의 행렬을 수정합니다. 나는'csr_matrix'와'csc_matrix'를 고려했지만, 나는 CSR/CSC 행렬에 할당하는 것은 일반적으로 나쁜 생각이다. 이러한 포맷의 희박 구조를 바꾸려면 O (nnz) 연산이 필요하다. 기본적으로 처음부터 행렬을 재구성하는 것을 의미합니다. " –
열이나 행을 수정하고 있습니까? 'lil'은 행에 유용합니다. 왜냐하면 각 행은 2 개의리스트에있는 간단한 엘리먼트로 표현되기 때문입니다. 특정 열을 사용하여 작업하면 많은 중첩 목록 내의 요소에 액세스해야합니다. – hpaulj