파이썬(Python)/Scipy

scipy.sparse.coo_matrix

leebaro 2017. 8. 22.
728x90

scipy.sparse.coo_matrix


class scipy.sparse.coo_matrix(arg1, shape=None, dtype=None, copy=False)



coo_matrix는 아래와 같은 방법으로 이용 가능하다


coo_matrix(D)

dense matrix D와 함께 사용


coo_matrix(S)

또 다른 sparse matrix S (equivalent to S.tocoo())


coo_matrix((M, N), [dtype])

shape(M, N)과 함께 빈 matrix를 만든다. dtype은 선택적이고 기본으로 dtype='d'이다


coo_matrix((data, (i, j)), shape=(M, N)])

아래와 같은 3개의 배열을 이용해 만든다.

        1. data[:] 는 순서에 상관없이 matrix 전체를 이용
        2. i[:]는 matrix의 행 색인을 이용
        3. j[:]는 matrix의 열 색인을 이용


노트


Sparse matrix는 산술 연산에 사용될 수 있다. 이 것은 덧셈, 뺄셈, 곱셈, 나눗셈, 행렬을 지원한다.


COO 포멧의 이점

    • sparse 포멧에 따라 빠른 변환이 가능함
    • entries 복제가 가능함
    • CSR/CSS 포멧에서 빠른 변환이 가능함

COO 포멧의 단점
    • 아래 사항을 직접적으로 지원하지 않음
      • 산술 연산
      • 슬라이싱

용도
    • COO는 sparse matrix를 만드는 빠른 포멧이다
    • 일단 matrix가 만들어지면, 빠른 산술 연산과 행렬 벡터 연산을 위해 CSR 또는 CSC 포멧으로 변환이 가능하다
    • CSR 또는 CSC 포멧으로 변환 시 기본적으로 중복되는 (i, j)항목이 함께 합산된다. 이것은 유한 요소 행렬 등의 효율적인 구성을 용이하게한다
      (아래 예제를 보면 이해가 될 것이다)

예제


# 

coo_matrix를 이용해 3x4 매트릭스를 생성

>>> from scipy.sparse import coo_matrix
>>> coo_matrix((3, 4), dtype=np.int8).toarray()
array([[0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0]], dtype=int8)

# row, col, data 배열을 이용하여 matrix를 만듬. data는 순차적으로 row, col의 좌표값에 위치하는 셀에 입력 됨 >>> row = np.array([0, 3, 1, 0]) >>> col = np.array([0, 3, 1, 2]) >>> data = np.array([4, 5, 7, 9]) >>> coo_matrix((data, (row, col)), shape=(4, 4)).toarray() array([[4, 0, 9, 0], [0, 7, 0, 0], [0, 0, 0, 0], [0, 0, 0, 5]])

# (0,0) = 4, (0,2) = 9, .....

# (0,0) = 1 이 3번 나왔기 때문에 (0,0) = 3이 된다 >>> # example with duplicates >>> row = np.array([0, 0, 1, 3, 1, 0, 0]) >>> col = np.array([0, 2, 1, 3, 1, 0, 0]) >>> data = np.array([1, 1, 1, 1, 1, 1, 1]) >>> coo_matrix((data, (row, col)), shape=(4, 4)).toarray() array([[3, 0, 1, 0], [0, 2, 0, 0], [0, 0, 0, 0], [0, 0, 0, 1]])



Reference

https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.coo_matrix.html

728x90