2014-07-07 2 views
2

spyse NxN crs 행렬이 있다고 가정 해 보겠습니다. 그 행렬을 부분 공간으로 제한하고 싶습니다. M 개의 인덱스를 유지합니다 (N 개의 부울 배열로 주어지며, M은 참입니다). 이렇게하면 MxM 스파 스 행렬이 생깁니다.sparse 행렬을 scipy의 부분 공간으로 제한

분명히 할 수있는 한 가지 방법은 계수를 데이터 배열과 좌표 배열 두 개로 추출하고 정렬을 사용하여 좌표의 번호를 다시 지정하는 것입니다. 이것은 아프고 추악합니다.

거기에 기능이 없거나이를 수행하는 라이브러리 호출이 없습니까?

답변

5

y가 희소 행렬 인 경우

In [59]: y[mask][:, mask] 
Out[59]: 
<103x103 sparse matrix of type '<type 'numpy.float64'>' 
    with 51 stored elements in Compressed Sparse Row format> 

:

In [57]: mask.dtype 
Out[57]: dtype('bool') 

In [58]: mask.shape 
Out[58]: (200,) 

그럼 y[mask][:, mask] 원하는 행렬을 산출 :

In [56]: y 
Out[56]: 
<200x200 sparse matrix of type '<type 'numpy.float64'>' 
    with 197 stored elements in Compressed Sparse Row format> 

mask은 1 차원 부울 배열

NumPy와는 당신이 원하는 인덱스를 구성하기 위해 여기에 사용할 수있는 기능 np.ix_이 있지만 상당히 느립니다 : 모두 y[mask][:, mask]하고,의 뷰가 아닌 새로운 스파 스 행렬을 반환 y[np.ix_(mask, mask)] 것을

In [64]: y[np.ix_(mask, mask)] 
Out[64]: 
<103x103 sparse matrix of type '<type 'numpy.float64'>' 
    with 51 stored elements in Compressed Sparse Row format> 

In [65]: %timeit y[np.ix_(mask, mask)] 
10 loops, best of 3: 59.8 ms per loop 

In [66]: %timeit y[mask][:, mask] 
1000 loops, best of 3: 494 µs per loop 

주 원래 스파 스 매트릭스. 임의의 행과 열을 선택하기 때문에보기를 반환 할 방법이 없습니다. y[np.ix_(mask, mask)] 단지 하나의 인덱스를 사용하기 때문에

그러나 그것에 배정 y.__setitem__ 따라서 (y의 방법) y 영향을 호출 이에

y[np.ix_(mask, mask)] = other 

, y[mask]y 무관 한 행렬이기 때문에, 과제물

y[mask][:, mask] = other 

__setitem__이 독립 행렬의 방법이므로 y에 영향을 미치지 않습니다.

+0

고마워요! 나는 그것을 시도 할 것이다 (나의 자료를 편리하게 가지지 마라). N ~ 100,000의 계수는 약 30,000,000이고 M은 ~ 60,000입니다. –

+0

>>> G [마스크] :, 마스크] 트레이스 백 (최근 통화 마지막) 파일 ""라인 1 파일 "/usr/local/lib/python2.7/dist-packages /scipy/sparse/csr.py ", 247 줄, __getitem__ return self [행 :] * P 파일"/usr/local/lib/python2.7/dist-packages/scipy/sparse/base.py ", 263 줄, __mul__ return self._mul_sparse_matrix (기타) 파일"/usr/local/lib/python2.7/dist-packages/scipy/sparse/compressed.py ", 줄 300, _mul_sparse_matrix 인덱스 = np.empty (nnz, dtype = np.intc) ValueError : 음수 차원을 사용할 수 없습니다. –

+0

"음수 값을 사용할 수 없습니다."라는 메시지 [결과 매트릭스가 너무 크다] (http://stackoverflow.com/a/12120778/190597).이 문제는 새로운 버전의 scipy에서 수정 된 것으로 보입니다. – unutbu