2017-04-25 3 views
1

스파 스 매트릭스에 대한 파이썬의 행 정보 목록이 있습니다. 각 행은 (열, 값) 튜플의 목록으로 표현됩니다. 호출 alist :튜플 목록에서 스파 스 lil_matrix 구성하기

alist = [[(1,10), (3,-3)], 
     [(2,12)]] 

을 내가 효율적으로이 같은 매트릭스의 결과 목록이 목록에서 scipy 스파 스 매트릭스를 구성 할 수 방법 : scipy.sparse.lil_matrix을 만들기 위해

0 10 0 -3 
0 0 2 0 

확실한 방법 인 내부적으로이 "목록 목록"구조를 가지고 있습니다. 다른 희소 배열에서 시작하는 조밀 한 배열

  • 부터

    • 그냥 빈 배열하는 유일한 방법 그래서

    을 구성 :하지만 scipy.sparse.lil_matrix — SciPy v0.19.0 Reference Guide에서 난 그냥 셋을 구성하는 방법을 참조 새로운 데이터를 얻으려면 다른 일부 드문 드문 한 행렬 표현으로이 문제를 해결하거나 밀도가 높은 배열로 시작해야합니다. 어느 쪽도 초기 문제를 처리하지 않으며 둘 다보다 효율적인 표현이 될 수없는 것처럼 보입니다 0 그 자체에 대해

    나는 빈 것을 만들 수 있고, 값을 추가하기 위해 루프를 사용할 수 있다고 생각하지만, 분명히 나는 ​​뭔가를 놓치고있다.

    scipy 문서는 스파 스 행렬에 관해서 정말 실망 스럽습니다.

  • 답변

    1

    데이터 레이아웃이 비정상적입니다. 여기에 내 첫 찌르기가 사용됩니다.

    In [565]: M = sparse.lil_matrix((2,4), dtype=int) 
    In [566]: M 
    Out[566]: 
    <2x4 sparse matrix of type '<class 'numpy.int32'>' 
        with 0 stored elements in LInked List format> 
    In [567]: for i,row in enumerate(alist): 
        ...:  for col in row: 
        ...:   M[i, col[0]] = col[1] 
        ...:   
    In [568]: M 
    Out[568]: 
    <2x4 sparse matrix of type '<class 'numpy.int32'>' 
        with 3 stored elements in LInked List format> 
    In [569]: M.A 
    Out[569]: 
    array([[ 0, 10, 0, -3], 
         [ 0, 0, 12, 0]]) 
    

    예, 반복적입니다. 그 목적에 가장 적합한 형식은 lil입니다.

    또는 입력의 공통 coo 스타일을 사용하여 : 즉

    로 시작 :

    또 다른 옵션은 빈 lil 매트릭스를 생성하고 직접 그 속성을 작성하는 것입니다
    In [580]: data,col,row = [],[],[] 
    In [581]: for i, rr in enumerate(alist): 
        ...:  for cc in rr: 
        ...:   row.append(i) 
        ...:   col.append(cc[0]) 
        ...:   data.append(cc[1]) 
        ...:   
    In [582]: data,col,row 
    Out[582]: ([10, -3, 12], [1, 3, 2], [0, 0, 1]) 
    In [583]: M1=sparse.coo_matrix((data,(row,col)),shape=(2,4)) 
    In [584]: M1 
    Out[584]: 
    <2x4 sparse matrix of type '<class 'numpy.int32'>' 
        with 3 stored elements in COOrdinate format> 
    In [585]: M1.A 
    Out[585]: 
    array([[ 0, 10, 0, -3], 
         [ 0, 0, 12, 0]]) 
    

    In [591]: m.data 
    Out[591]: array([[], []], dtype=object) 
    In [592]: m.rows 
    Out[592]: array([[], []], dtype=object) 
    

    으로 변경하고 다음으로 변경하십시오.

    In [587]: M.data 
    Out[587]: array([[10, -3], [12]], dtype=object) 
    In [588]: M.rows 
    Out[588]: array([[1, 3], [2]], dtype=object) 
    

    alist 구조에서는 2 단계 반복이 필요합니다. 또 다른 의견에


    In [593]: for i, rr in enumerate(alist): 
        ...:  for cc in rr: 
        ...:   m.rows[i].append(cc[0]) 
        ...:   m.data[i].append(cc[1])  
    In [594]: m 
    Out[594]: 
    <2x4 sparse matrix of type '<class 'numpy.int32'>' 
        with 3 stored elements in LInked List format> 
    In [595]: m.A 
    Out[595]: 
    array([[ 0, 10, 0, -3], 
         [ 0, 0, 12, 0]]) 
    

    당신은 csr indptr 이해에 어려움을 언급했다. 이를 얻는 가장 쉬운 방법은 다음 형식 중 하나를 변환하는 것입니다.

    In [597]: Mr=M.tocsr() 
    In [598]: Mr.indptr 
    Out[598]: array([0, 2, 3], dtype=int32) 
    In [599]: Mr.data 
    Out[599]: array([10, -3, 12]) 
    In [600]: Mr.indices 
    Out[600]: array([1, 3, 2], dtype=int32) 
    
    +0

    이렇게 명확하고 유용한 답변입니다. 감사합니다.COO 형식을 기반으로하는 생성자는 가장 자연스러운 것처럼 보입니다. 생성기를 생성하고 메모리 및 시간 효율적인 입력 파이프 라인을 구현할 수있는 일부 생성기를 제안 할 수 있습니다. 나는 scipy 사람들이 사람들이 그들을 찾을 수있는 방식으로 이런 예제를 추가하기를 바랍니다. 이것은 내 데이터가 들어온 형식이며 [Sparse array - Wikipedia] (https://en.wikipedia.org/wiki/Sparse_array)에서 논의 된 바와 같이 이러한 서로 다른 스파 스 형식을 지원하는 시스템의 수를 감안할 때, 더 많은 사람들이 데이터를 사용하여 데이터를 교환 할 것이라고 생각합니다. – nealmcb

    +1

    먼저 유한 요소 문제에 대해 MATLAB에서 희소 매트릭스로 작업했습니다. 거기에'coo' 스타일의 입력 만이 유일한 옵션입니다. 내부적으로는 데이터를'csc'로 저장합니다 (최소한 그것은'.mat' 파일에 저장되는 형식입니다). 스파 스 수학의 대부분은 선형 대수 문제를 위해 개발되었습니다. 'scipy'는 많은 포맷을 추가합니다 (Wiki 기사의 링크 참고). 이제는 많은 양의 행렬 관심이 큰 데이터 문제, 희소 한 특성 행렬, 기계 학습, 언어학 등에서 비롯됩니다. 'scikit learn'은 컴파일 된 희소 행렬 유틸리티를 추가합니다. – hpaulj