먼저, 사용자가 원하는 것은가 아닌 hstack
을 사용해야한다는 것입니다. 어떤 경우 든 스파 스 형식의 선택은 성능 문제의 일부입니다. 다음을 시도하십시오.
n, p = 4700, 67
csr_vecs = [sps.rand(1, p, density=0.5, format='csr') for j in xrange(n)]
lil_vecs = [vec.tolil() for vec in csr_vecs]
%timeit sps.vstack(csr_vecs, format='csr')
1 loops, best of 3: 722 ms per loop
%timeit sps.vstack(lil_vecs, format='lil')
1 loops, best of 3: 1.34 s per loop
따라서 CSR에 대한 swithcing에서 이미 2 배 향상되었습니다. 또한, scipy.sparse
의 스태킹 기능은 매우 최적화 된 것처럼 보이지 않습니다. 확실히 스파 스 벡터가 아닙니다. ,
%timeit csr_stack(csr_vecs)
100 loops, best of 3: 11.7 ms per loop
%timeit lil_stack(lil_vecs)
10 loops, best of 3: 37.6 ms per loop
%timeit lil_stack(lil_vecs).tolil()
10 loops, best of 3: 53.6 ms per loop
: 그럼
>>> np.allclose(sps.vstack(csr_vecs).A, csr_stack(csr_vecs).A)
True
>>> np.allclose(csr_stack(csr_vecs).A, lil_stack(lil_vecs).A)
True
을 빠르게 실질적이다
def csr_stack(vectors):
data = np.concatenate([vec.data for vec in vectors])
indices = np.concatenate([vec.indices for vec in vectors])
indptr = np.cumsum([0] + [vec.nnz for vec in vectors])
return sps.csr_matrix((data, indices, indptr), shape=(len(vectors),
vectors[0].shape[1]))
import itertools as it
def lil_stack(vectors):
indptr = np.cumsum([0] + [vec.nnz for vec in vectors])
data = np.fromiter(it.chain(*(vec.data[0] for vec in vectors)),
dtype=vectors[0].dtype, count=indptr[-1])
indices = np.fromiter(it.chain(*(vec.rows[0] for vec in vectors)),
dtype=np.intp, count=indptr[-1])
return sps.csr_matrix((data, indices, indptr), shape=(len(vectors),
vectors[0].shape[1]))
의미가 있습니다 : 다음 두 가지 기능은 CSR 희소 행렬을 반환, CSR 또는 LIL 벡터의 목록을 쌓아 CSR로 전환하면 성능을 100 배 이상 향상시킬 수 있습니다. LIL을 고수하면 성능 향상은 약 30 배에 불과합니다. 결합 된 매트릭스에서 CSR을 사용할 수 있다면 LIL을 주장 할 때보 다 덜합니다.
제이미 (Jaime)와 알렉산더 (Alexander)의 답변을 모두 사용하여 프로그램이 정말 빨라졌습니다. 프로그램이 수천 번 같은 방법으로 실행될 때 100 배 더 빨리 말하면, 그것을 말할 필요가 :)). 놀라운 도움, 감사합니다. – cenna75