행렬이 실제로 부족한 경우 스파 스 점이 더 빠릅니다. 하지만 배열을 csr_matrix.dot
함수로 던질 수는 없습니다.
In [68]: N=1000
In [69]: from scipy import sparse
In [70]: A=np.eye(N) # the diagonal is more interesting than all zeros
In [71]: B=np.random.rand(N,N)
자료 케이스 - 밀도 행렬 제품
In [72]: timeit np.dot(B,A)
10 loops, best of 3: 98.8 ms per loop
이 시간은 같은 크기의 모든 배열 (예를 들어,이 dot(B,B)
, dot(A,A)
)에 대해 동일합니다.
둘다에서 희소 매트릭스를 만듭니다. As
는 Bs
이 전혀없는, 제로 많이 가지고 있지만 드문 드문 형식
In [73]: As=sparse.csr_matrix(A)
In [74]: Bs=sparse.csr_matrix(B)
주 변환 시간에; 그들은 사소하지 않다
In [101]: timeit sparse.csr_matrix(A)
100 loops, best of 3: 13.8 ms per loop
In [102]: timeit sparse.csr_matrix(B)
10 loops, best of 3: 50.1 ms per loop
csr 매트릭스가있는 매트릭스 제품이 더 빠를 수 있습니다.더 명확 해지기 때문에 Bs.dot(As)
양식을 사용하겠습니다. Bs*As
및 np.dot(Bs,As)
은 동일합니다. 우리는 변환 시간을 포함한다면 np.dot(Bs,A)
In [107]: timeit Bs.dot(As)
100 loops, best of 3: 19 ms per loop
In [112]: timeit sparse.csr_matrix(B).dot(sparse.csr_matrix(A)).A
10 loops, best of 3: 94.1 ms per loop
에 띄게 조밀 한 버전보다 더 나은,하지만 근소하게 더 나은하지 않습니다.
그러나
때때로 널리 행렬
In [108]: timeit As.dot(Bs)
100 loops, best of 3: 10 ms per loop
In [109]: timeit As.dot(B)
100 loops, best of 3: 5.82 ms per loop
In [110]: timeit As.dot(As)
1000 loops, best of 3: 215 µs per loop
In [111]: timeit Bs.dot(Bs)
1 loop, best of 3: 3.83 s per loop
'% 시간 csr_matrix (B) .DOT (A)의 희소성에 따라 달라질 수 있음을 유의의''csr_matrix' 먼저'B'의 변환을한다. 그게 당신이 원하는 시간인가요? – jotasi
그러나 B는 드문 드문 한 행렬이 아닙니다. csr_matrix는 스파 스 행렬에만 적용해야합니다. – NunodeSousa
나는 행렬이 매우 크고 드문 경우에만 희소 행렬 방법을 사용한다. 'np.dot'는 일반적인 시나리오에서 매우 효율적입니다. – Divakar