Sparse한 matrix를 다룰 때 scipy.sparse를 사용한다. 대규모 행렬을 다룰 때 메모리 문제를 해결하기 위해 사용한다. scipy.sparse의 matrix를 만드는 방법은 sparse matrix 구성요소를 직접 입력하는 방법과 numpy.ndarray를 입력하는 방법이 있다.
1. numpy.ndarray를 입력
import numpy as np
from scipy import sparse
matrix = np.eye(3)
matrix
# array([[1., 0., 0.],
# [0., 1., 0.],
# [0., 0., 1.]])
# csr_matrix()를 이용
sparse_matrix = sparse.csr_matrix(matrix)
sparse_matrix
# <3x3 sparse matrix of type '<class 'numpy.float64'>'
# with 3 stored elements in Compressed Sparse Row format>
- sparse matrix 객체가 만들어진다.
print(sparse_matrix)
# (0, 0) 1.0
# (1, 1) 1.0
# (2, 2) 1.0
2. 구성요소를 직접 입력
data = np.ones(3)
row_indices = np.arange(3)
col_indices = np.arange(3)
print(data)
print(row_indices)
print(col_indices)
# [1. 1. 1.]
# [0 1 2]
# [0 1 2]
# sparse.coo_matrix을 이용
sparse_matrix = sparse.coo_matrix((data, (row_indices, col_indices)))
print(sparse_matrix)
# (0, 0) 1.0
# (1, 1) 1.0
# (2, 2) 1.0
- todense(): dense matrix로 변환하여 모양을 확인한다.
numpy.ndarray로 변환 된다.
from scipy.sparse import csr_matrix
rows = [0, 0, 1, 1, 3, 3]
cols = [0, 4, 1, 3, 0, 3]
data = [1, 2, 3, 4, 5, 6]
csr = csr_matrix((data, (rows, cols)))
csr.todense()
# matrix([[1, 0, 0, 0, 2],
# [0, 3, 0, 4, 0],
# [0, 0, 0, 0, 0],
# [5, 0, 0, 6, 0]])
- DoK format
- Dictionary of Keys 의 약자이다. 0 이 아닌 값들의 위치를 저장하는 방식으로 (row, column) 을 key 로 지니는 dict 로 구성되어 있다.
- 직관적으로 x[i,j] 에 접근하기가 쉽습니다. (i,j) pair 의 key 가 dict 에 존재하는지 확인하고, 그 값이 있다면 key 를 value 로 map 합니다.
from scipy.sparse import dok_matrix
x = [[1, 0, 0, 0, 2],
[0, 3, 0, 4, 0],
[0, 0, 0, 0, 0],
[5, 0, 0, 6, 0]]
dok = dok_matrix(x)
print(dok.keys())
# dict_keys([(0, 0), (0, 4), (1, 1), (1, 3), (3, 0), (3, 3)])
print(dok.values())
# dict_keys([(0, 0), (0, 4), (1, 1), (1, 3), (3, 0), (3, 3)])
for key, value in dok.items():
print('{} = {}'.format(key, value))
# (0, 0) = 1
# (0, 4) = 2
# (1, 1) = 3
# (1, 3) = 4
# (3, 0) = 5
# (3, 3) = 6
- dok.nnz : non-zero의 개수
- dok.shape: matrix의 크기
- 이 둘로 sparsity rate를 구할 수 있다.
print(dok.nnz)
print(dok.shape)
sparsity = 1 - dok.nnz / (dok.shape[0] * dok.shape[1])
print(sparsity)
# 6
# (4,5)
# 0.7
반응형
'Python' 카테고리의 다른 글
[Numpy] 넘파이 기초 (0) | 2023.01.09 |
---|---|
[Python] Raw String / 문자열 앞 r (0) | 2022.11.18 |