sparse
은 이와 같은 행을 선택하기 위해 행렬 곱셈을 사용합니다. 나는 extractor
행렬의 세부 사항을 다른 SO 질문에서 계산했으나 대략 (m, n) 행렬로부터 (p, n) 행렬을 얻으려면 (p, m) 행렬을 사용해야한다. (0 이외의 값으로 p
)).
매트릭스 곱셈 자체는 2 패스 프로세스입니다. 첫 번째 패스는 결과 행렬의 크기를 결정합니다.
밀도가 높은 numpy
어레이와 달리 스파 스 매트릭스 슬라이스는보기를 반환하지 않습니다.
Sparse matrix slicing using list of int
는 추출기 매트릭스에 대한 자세한 내용이 있습니다. 나는 또한 csr.sum(axis=1)
을 테스트 할 것을 제안한다. 왜냐하면 그것도 행렬 곱셈을 사용하기 때문이다.
def extractor(indices, N):
indptr=np.arange(len(indices)+1)
data=np.ones(len(indices))
shape=(len(indices),N)
return sparse.csr_matrix((data,indices,indptr), shape=shape)
그래서 다른 모든 행을 인덱싱하는 것은 필요합니다 귀하의 예제에서
In [99]: M = sparse.random(100,80,.1, 'csr')
In [100]: M
Out[100]:
<100x80 sparse matrix of type '<class 'numpy.float64'>'
with 800 stored elements in Compressed Sparse Row format>
In [101]: E = extractor(np.r_[1:100:2],100)
In [102]: E
Out[102]:
<50x100 sparse matrix of type '<class 'numpy.float64'>'
with 50 stored elements in Compressed Sparse Row format>
In [103]: M1 = E*M
In [104]: M1
Out[104]:
<50x80 sparse matrix of type '<class 'numpy.float64'>'
with 407 stored elements in Compressed Sparse Row format>
귀하의 매트릭스를 그냥 22메가바이트 (값) + 일부 보조-물건, 메모리 아마도 <80메가바이트입니다. 그럼, 그게 당신의 문제의 근원 (귀하의 서버에 뭔가가 아마 39 기가 바이트의 메모리를 사용하고 있는지), 확실합니까? – sascha
(1)이 슬라이스는 두 번째 요소 (홀수 요소)에서 시작하여 다른 요소를 취합니다. (2) 서버에는 도커 컨테이너가 많이 있고 기타 유지 관리 프로세스가 모두 40GB를 사용하여 실행 중입니다. –