2012-08-24 5 views
3

약 2 개의 lil_matrix 희소 행렬의 내적을 취하려고합니다. 100,000 x 50,000 및 50,000 x 100,000입니다.SciPy의 두 희소 행렬의 내적을 취하는 ValueError

from scipy import sparse 
a = sparse.lil_matrix((100000, 50000)) 
b = sparse.lil_matrix((50000, 100000)) 

c = a.dot(b) 

이 오류가 : 일이 될 수 있습니다 무엇에

File "/usr/lib64/python2.6/site-packages/scipy/sparse/base.py", line 211, in dot 
return self * other 
File "/usr/lib64/python2.6/site-packages/scipy/sparse/base.py", line 247, in __mul__ 
return self._mul_sparse_matrix(other) 
File "/usr/lib64/python2.6/site-packages/scipy/sparse/base.py", line 300, in  _mul_sparse_matrix 
return self.tocsr()._mul_sparse_matrix(other) 
File "/usr/lib64/python2.6/site-packages/scipy/sparse/compressed.py", line 290, in _mul_sparse_matrix 
indices = np.empty(nnz, dtype=np.intc) 
ValueError: negative dimensions are not allowed 

어떤 아이디어 - 램 64GB의에 대해있는 컴퓨터에서이 작업을 실행하고, 점을 실행할 때 13기가바이트에 대한 사용.

답변

3

이것은 잘못된 오류 메시지이지만 "문제"는 결과 행렬이 너무 커야합니다 (크기가 아닌 0이 아닌 요소가 너무 많음).

Scipy는 희소 포맷에 대해 indptrindices을 저장하기 위해 int32을 사용합니다. 즉, sparsematrix는 2^31 개 이상의 0이 아닌 원소를 가질 수 없습니다. 어쩌면 장난감 문제가 아니라면 또는 uint32을 사용하여 scipy의 코드를 변경할 수 있습니다. 하지만 어쩌면 희소 행렬을 사용하는 것이이 문제를 해결하기위한 최선의 해결책이 아닐 수도 있습니다.

편집 : 이것은 새로운 scipy 버전 AFIAK에서 해결되었습니다.

1

그냥 @ seberg의 답변에 추가하십시오.

github.com/scipy/scipy에는 두 가지 문제가 있습니다. 당신은 당신의 자신에 사람들을 끌어 할 수 있어야한다 등으로 인해 일부 누락 된 테스트에 -

Issue #1833 통합되지 않은 일부 풀 요청 (SciPy 버전 0.13.1 년 11 월 2013)와 Issue #442 (2013 4월 폐쇄 표시) 설치를 수행하고 더 큰 희소 행렬을 지원하는 버전을 컴파일하십시오.