2016-07-29 2 views
4

각 줄마다 8 개의 문자열 쌍이있는 큰 파일이 있습니다. 다음과 같음 :가장자리 목록을 읽고 scipy 스파 스 행렬을 만드는 방법

ab1234gh iu9240gh 

각 줄에.

이 파일은 실제로 그래프를 나타내고 각 문자열은 노드 ID입니다. 내가 파일을 읽고 scipy 드문 드문 인접성 매트릭스를 만들고 싶습니다. 그런 다음이 행렬에서 파이썬에서 사용할 수있는 여러 도구 중 하나를 사용하여 PCA를 실행합니다.

이렇게하려면 깔끔한 방법이 있습니까? 아니면 먼저 RAM에서 그래프를 만들어 스파 스 매트릭스로 변환해야합니까? 파일이 크기 때문에 가능하면 중간 단계를 피하고 싶습니다.

궁극적으로 나는 희소 인접 매트릭스를 http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.TruncatedSVD.html#sklearn.decomposition.TruncatedSVD에 먹일 것입니다.

답변

4

나는 이것이 sklearn의 정규 작업이라고 생각하므로,이 작업을 수행하는 패키지 나 다른 SO 질문에 대한 답변이 있어야합니다. 올바른 태그를 추가해야합니다.

In [638]: A=np.array([('a','b'),('b','d'),('a','d'),('b','c'),('d','e')]) 
In [639]: A 
Out[639]: 
array([['a', 'b'], 
     ['b', 'd'], 
     ['a', 'd'], 
     ['b', 'c'], 
     ['d', 'e']], 
     dtype='<U1') 

사용 np.unique : N 행, 문자 값 2 열 - 샘플 2 차원 배열을 확인

을 :

그러나

그냥 내가 할 줄 것을 numpysparse의 내 지식에서 작업 고유 한 문자열을 식별하고 해당 문자열에서 원래 배열로 매핑하는 보너스로 사용할 수 있습니다. 이것은 업무의 주역입니다.

In [640]: k1,k2,k3=np.unique(A,return_inverse=True,return_index=True) 
In [641]: k1 
Out[641]: 
array(['a', 'b', 'c', 'd', 'e'], 
     dtype='<U1') 
In [642]: k2 
Out[642]: array([0, 1, 7, 3, 9], dtype=int32) 
In [643]: k3 
Out[643]: array([0, 1, 1, 3, 0, 3, 1, 2, 3, 4], dtype=int32) 

나는 A의 각 항목에 대해 행 안부를 확인하기 위해 그 inverse 배열을 바꿀 수 있습니다. 것과

In [644]: rows,cols=k3.reshape(A.shape).T 
In [645]: rows 
Out[645]: array([0, 1, 0, 1, 3], dtype=int32) 
In [646]: cols 
Out[646]: array([1, 3, 3, 2, 4], dtype=int32) 

각 'intersection`에서 1을 가지는 희소 행렬을 구축하기 위해 간단하다.

In [648]: M=sparse.coo_matrix((np.ones(rows.shape,int),(rows,cols))) 
In [649]: M 
Out[649]: 
<4x5 sparse matrix of type '<class 'numpy.int32'>' 
    with 5 stored elements in COOrdinate format> 
In [650]: M.A 
Out[650]: 
array([[0, 1, 0, 1, 0], 
     [0, 0, 1, 1, 0], 
     [0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 1]]) 

첫번째 행 a은 2 · 4 COL, bd의 값을 갖는다. 등등. ============================

원래 내가했다 :

In [648]: M=sparse.coo_matrix((np.ones(k1.shape,int),(rows,cols))) 

이 잘못 . data 배열은 모양이 rowscols과 일치해야합니다. k1 같은 크기가 있기 때문에 여기에 오류가 발생하지 않았습니다. 하지만 고유 한 값을 사용하면 오류가 발생할 수 있습니다.

====================

이 방식은 전체 데이터베이스의 경우, A 메모리에로드 할 수있는 것으로 가정합니다. unique과 비슷한 메모리가 필요합니다. 초기에 coo 행렬은 매개 변수로 제공된 배열을 사용하기 때문에 메모리 사용량을 증가시키지 않을 수 있습니다.그러나 임의의 계산 및/또는 csr 또는 다른 형식으로의 변환은 추가 복사본을 만듭니다.

데이터베이스를 청크로로드하고 다른 구조를 사용하여 고유 한 값과 매핑을 얻는 방법으로 메모리 문제를 해결할 수 있습니다. 덩어리로 coo 행렬을 구성 할 수도 있습니다. 그러나 조만간 메모리 문제가 발생할 것입니다. scikit 코드는 그 희소 행렬의 복사본을 하나 이상 만들 것입니다.

+0

고맙습니다. 먼저 행렬 전체를 읽지 않고이 작업을 수행 할 수 있습니까? 그것은 청크에 의한 청크입니다. – eleanora

+0

정확하게 무엇을 원 하느냐에 따라 [이 답변]과 비슷한 것을 사용하여 청크로 파일 청크를 읽을 수 있습니다 (http://stackoverflow.com/questions/17056382/read-file-in-chunks-ram- 바이너리 파일로부터 usage-read-strings)를 찾아서 어떤 행과 열을 채워야하는지 찾아야한다. – Mahdi

+0

나는이 문제가 http://stackoverflow.com/questions/38688062/converting-a-1-2gb-list-of-edges-into-a-sparse-matrix에서 작동하도록하는 것에 관한 후속 조치를 게시했다. – eleanora

관련 문제