csr_matrix에서 특정 index의 data 접근

Namkyu Kim
3 min readOct 27, 2019

--

csr_matrix는 Scipy Library에서 제공하는 class로 sparse matrix를 저장하며 효율적인 연산을 지원한다.

csr_matrix의 경우 데이터를 data, indptr, indices로 관리한다. data는 matrix의 원소 값을 행 순서대로 가지고 있다.
예를 들어, 행렬 A가 3X3 크기의 행렬이고, A[0, 0] = 1, A[1, 0] = 0, A[0,2] = 4, A[2,1] = 3 이라고 한다면 data는 A[0,0], A[0,2], A[1,0], A[2,1]의 순서대로 값을 저장하여 [1, 0, 4, 3]의 형태를 보일 것이다.

csr_matrix는 행을 기준으로 data가 저장되는 반면, 형제 격인 csc_matrix의 경우 열을 기준으로 data가 저장된다. 또한 csr_matrix는 indptr과 indices를 이용해서 data의 각 원소에 대한행렬에서의 위치를 나타낸다.

indptr[i]는 i번째 행의 원소가 data의 어느 인덱스에서 시작되는지 나타낸다. 예를 들어 0번째 행은 data[0] 부터 시작하고, 1번째 행은 data[2]부터 시작하므로 indptr[0]=0, indptr[1]=2 이다. 만일 csr_matrix A에서 0번째 행에 대한 data를 가져오고 싶을 때, data[A.indptr[0]:A.indptr[1]]와 같이 사용하면 된다.

indices[i]는 data[i]의 열 번호를 저장한다. 즉, indices[0]=0, indices[1]=2, indices[2]=0, indices[3]=1 과 같은 식이다.

indptr과 indices를 통해 내가 원하는 위치에 있는 데이터가 data의 어느 위치에 존재하는지 알 수 있다. csr_matrix의 경우 행렬 index를 통해서 행렬 원소에 접근하는데 시간이 오래 걸리므로, indptr과 indices를 이용한 접근이 유용한 경우가 생긴다. 특히, nonzero()함수의 경우 행렬의 원소 값이 0이 아닌 data에 대해서만 index를 반환하기 때문에 행렬 자체가 0인 원소를 포함하는 경우 유용하게 사용할 수 있다. csr_matrix에 대한 자세한 내용은 documentation에서 확인 가능하다.

--

--