2014-07-09 2 views
6

저는 희소 행렬에서 일부 데이터를 조작하려고합니다. 일단 내가 하나를 만들었다면, 어떻게 그 안에 값을 추가/변경/업데이트합니까? 이것은 매우 기본적인 것으로 보이지만, 드문 드문 한 행렬 클래스 또는 웹 문서에서 찾을 수 없습니다. 나는 중요한 것을 놓치고 있다고 생각한다.scipy를 사용하여 스파 스 매트릭스에서 셀을 편집하는 방법은 무엇입니까?

정상적인 배열과 같은 방법으로 시도한 것입니다.

>>> from scipy.sparse import bsr_matrix 
>>> A = bsr_matrix((10,10)) 
>>> A[5][7] = 6 

Traceback (most recent call last): 
    File "<pyshell#11>", line 1, in <module> 
    A[5][7] = 6 
    File "C:\Python27\lib\site-packages\scipy\sparse\bsr.py", line 296, in __getitem__ 
    raise NotImplementedError 
NotImplementedError 

답변

1

BSR에 대한 문서는 여기 bsr matrix이며, CSR 여기 csr matrix입니다. bsr로 이동하기 전에 csr을 이해하는 것이 가치가있을 수 있습니다. 유일한 차이점은 bsr에는 행렬 항목이 있지만 csr의 기본 단위는 스칼라라는 점입니다.

내가 거기에 자신이 만든되면 매트릭스를 조작 할 수있는 매우 쉬운 방법이 있지만, 여기 당신이 뭘하려는 건지의 몇 가지 예입니다 알고하지 않습니다

,

import numpy as np 
from scipy.sparse import bsr_matrix, csr_matrix 

row = np.array([5]) 
col = np.array([7]) 
data = np.array([6]) 
A = csr_matrix((data,(row,col))) 

이것은 간단한 구문입니다 행렬에 원하는 모든 데이터를 배열 data에 나열한 다음 rowcol을 사용하여 데이터를 저장할 위치를 지정하십시오. 이렇게하면 행렬 차원이 가장 큰 행과 열 (이 경우 6x8 행렬)에 요소를 보유 할만큼 커지게됩니다. todense() 방법을 사용하여 표준 형태로 매트릭스를 볼 수 있습니다.

A.todense() 

그러나이 패턴을 사용하여 즉시 매트릭스를 조작 할 수는 없습니다. 여러분이 할 수있는 것은 행렬의 기본 scipy 표현을 수정하는 것입니다. 여기에는 indices, indptrdata의 3 가지 속성이 포함됩니다. 우선, 이미 생성 한 배열에 대해 이러한 속성의 값을 검사 할 수 있습니다.

>>> print A.data 
array([6]) 

>>> print A.indices 
array([7], dtype=int32) 

>>> print A.indptr 
array([0, 0, 0, 0, 0, 0, 1], dtype=int32) 

data가 예전 똑같다, 값의 1 차원 어레이 우리는 매트릭스 원한다. 차이점은이 데이터의 위치가 이제 rowcol 대신 indicesindptr으로 지정된다는 것입니다. indices은 매우 간단합니다. 각 데이터 항목이있는 열의 목록 일뿐입니다. 항상 같은 크기이고 data 배열입니다. indptr은 다소 까다 롭습니다. 이 데이터 구조는 각 데이터 항목에 무엇을 행 알 수 있습니다. 행 i에 대한

열 인덱스는 우리가 볼 수있는이 정의에서 indices[indptr[i]:indptr[i+1]]

에 저장되고, 워드 프로세서에서 인용하려면 indptr의 크기는 항상 행렬 +1의 행 수입니다. 익숙해 지려면 잠시 시간이 걸리지 만 각 행의 값을 통해 작업하면 직관력이 생깁니다. 모든 항목은 마지막 항목까지 0입니다. 즉, 행 i=0-4의 열 인덱스는 indices[0:0] 즉 빈 배열에 저장됩니다. 이 행은 모두 0이기 때문입니다. 마지막으로, 마지막 행인 i=5에서 data[0:1]이 행 5, 열 7에 있음을 알리는 indices[0:1]=7을 얻습니다.

이제 행 2 열 4에 값 ​​10을 추가하려고한다고 가정합니다.우리는 먼저 data 속성에

A.data = np.array([10,6]) 

우리는 열 (10)에있을 것입니다 나타 내기 위해 indices를 업데이트 다음

,

A.indices = np.array([4,7], dtype=np.int32) 

를 넣고 마지막으로 우리는 indptr

을 수정하여 될 것이다 행 표시
A.indptr = np.array([0,0,0,1,1,1,2], dtype=np.int32) 

indicesindptr의 데이터 형식을 만드는 것이 중요합니다.. indptr에서 진행되는 것을 시각화하는 한 가지 방법은 데이터가있는 행의 i에서 i+1으로 이동할 때 숫자가 변경된다는 것입니다. 또한 이와 같은 배열이 스파 스 매트릭스

B = csr_matrix((data,indices,indptr)) 

당신이 시도 단순히 배열에 색인처럼 쉬우면 그것은 좋은 것을 구성하는 데 사용할 수 있습니다,하지만 구현은 아직 없다. 적어도 당신을 시작하기에 충분해야합니다.

5

몇 가지 스파 스 매트릭스 형식이 있습니다. 일부는 색인 생성에 더 적합합니다. 그것을 구현 한 사람은 lil_matrix입니다.

Al = A.tolil() 
Al[5,7] = 6 # the normal 2d matrix indexing notation 
print Al 
print Al.A # aka Al.todense() 
A1 = Al.tobsr() # if it must be in bsr format 

각 형식에 대한 문서는 그것이 무엇이 좋고 어디가 좋지 않은지 제안합니다. 그러나 어떤 작업을 정의했는지에 대한 깔끔한 목록이 없습니다.

Advantages of the LIL format 
    supports flexible slicing 
    changes to the matrix sparsity structure are efficient 
    ... 
Intended Usage 
    LIL is a convenient format for constructing sparse matrices 
    ... 

dok_matrix도 색인 생성을 구현합니다.

coo_matrix의 기본 데이터 구조는 이해하기 쉽습니다. 기본적으로 coo_matrix((data, (i, j)), [shape=(M, N)]) 정의의 매개 변수입니다. 당신이 더 많은 할당이있는 경우 더 큰 data, i, j 목록 (또는 1D 배열)를 구축,

sparse.coo_matrix(([6],([5],[7])), shape=(10,10)) 

하고, 완료되면 구조 스파 스 매트릭스 : 같은 행렬을 작성하려면 사용할 수 있습니다.