2016-10-18 2 views
0

는 :왜 내 컴퓨터의 메모리보다 (분명히) 큰 배열을 만들 수 있습니까? 나는 아래의 코드를 실행하면

import scipy.sparse 
x = scipy.sparse.random(100000, 100000, 1e-4) 
y = x.toarray() 
print(y.nbytes) 

를 나는 80000000000 바이트 = 80기가바이트의 출력을 얻을. 그리고 아직 4GB의 RAM 만있는 Macbook Air를 사용하고 있습니다. 누군가 내 메모리 크기보다 큰 NumPy 배열을 (분명히) 만드는 방법을 설명 할 수 있습니까? y 어떻게 든 x의보기가 아니라 복사본입니까? scipy.sparse 설명서에서 이에 대해 아무 것도 발견하지 못했습니다. Unsurprisingly 나는 y.copy()과 같은 일을한다면 나는 Python을 크래시한다. 나는 10^10 크기의 배열로 무엇인가 할 수 없다. 감사!

버전 : 아나콘다 4.1.1, SciPy 0.17.1, NumPy 1.11.1을 통한 Python 3.5.2.

답변

0

이것은 numpy가 실제로 모든 공간을 할당하지 않기 때문입니다. 대부분 희소 배열 및 행렬은 triplets, linked nodes 또는 그 사이의 모든 빈 공간을 무시하는 다른 수단으로 표시됩니다. 바이트는 메모리의 실제 데이터가 아니라 매트릭스/배열의 지정된 크기를 기반으로 계산됩니다.

+0

'x' 배열은 희소 행렬 형식이므로 위에서 말한 것은 확실히 적용됩니다. 그러나'y'를 얻기 위해 필자는 그것을 ['toarray()'] (https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.spmatrix.toarray)로 명시 적으로 스파 스에서 밀집된 형태로 변환했다. html # scipy.sparse.spmatrix.toarray). 그래서 혼란 스럽습니다. – joelslft

+0

여전히 numpy 유형을 사용하고 있습니다. 'toarray()'는 그것을 원시 파이썬리스트로 변환하지 않기 때문에, 왜 당신이 그것에'.nbytes'를 액세스 할 수 있습니다. 그것이 원시 파이썬리스트로 변환 될 때까지 가능한 한 공간을 절약하기 위해 드문 드문 표현을 사용하고있을 것입니다. – Soviut