[python] NumPy를 사용하여 희소 행렬을 다루는 방법은 무엇인가요?

희소 행렬은 대부분의 원소가 0인 행렬을 의미합니다. 이러한 행렬은 공간 및 계산 시간을 절약할 수 있기 때문에 많은 데이터 분석 및 머신러닝 문제에서 사용됩니다. NumPy와 SciPy는 희소 행렬을 다루기 위한 다양한 기능과 함수를 제공합니다. 이번 글에서는 NumPy를 사용하여 희소 행렬을 다루는 방법에 대해 알아보겠습니다.

1. 희소 행렬 만들기

NumPy에서 희소 행렬을 만드는 가장 일반적인 방법은 scipy.sparse 모듈을 사용하는 것입니다. scipy.sparse 모듈에는 다양한 희소 행렬 타입이 있습니다.

import numpy as np
from scipy.sparse import csr_matrix

# 행렬 생성
matrix = np.array([
    [0, 0, 0],
    [0, 1, 0],
    [0, 0, 2]
])

# CSR 희소 행렬 생성
sparse_matrix = csr_matrix(matrix)

위의 예제에서는 sparse_matrix 변수에 CSR (Compressed Sparse Row) 형식의 희소 행렬을 생성했습니다. CSR 형식은 행의 인덱스, 열의 인덱스, 그리고 원소값을 저장하는 방법입니다.

2. 희소 행렬 다루기

NumPy의 희소 행렬은 일반적인 NumPy 배열과 같이 다룰 수 있습니다. 예를 들어, 특정 원소에 접근하고 값을 변경하는 것이 가능합니다.

# 특정 원소에 접근하기
print(sparse_matrix[1, 1])  # 1

# 원소 변경하기
sparse_matrix[1, 1] = 5

# 변경된 행렬 출력하기
print(sparse_matrix.toarray())

3. 희소 행렬의 연산

NumPy의 희소 행렬은 기본적인 연산에 대한 지원을 제공합니다. 예를 들어, 덧셈, 뺄셈, 곱셈, 스칼라 곱셈 등이 가능합니다.

import numpy as np
from scipy.sparse import csr_matrix

# 행렬1 생성
matrix1 = np.array([
    [0, 0, 0],
    [0, 1, 0],
    [0, 0, 2]
])

# 행렬1을 CSR 희소 행렬로 변환
sparse_matrix1 = csr_matrix(matrix1)

# 행렬2 생성
matrix2 = np.array([
    [1, 0, 0],
    [0, 0, 2],
    [3, 0, 0]
])

# 행렬2를 CSR 희소 행렬로 변환
sparse_matrix2 = csr_matrix(matrix2)

# 덧셈
addition = sparse_matrix1 + sparse_matrix2

# 곱셈
multiplication = sparse_matrix1 * sparse_matrix2

# 스칼라 곱셈
scalar_multiplication = sparse_matrix1 * 2

# 결과 출력
print("Addition:\n", addition.toarray())
print("Multiplication:\n", multiplication.toarray())
print("Scalar Multiplication:\n", scalar_multiplication.toarray())

4. 희소 행렬의 압축과 희소성 확인

앞서 생성한 희소 행렬은 CSR 형식으로 저장되어 있기 때문에 각각의 행이 연속된 원소만을 포함하고 있는 형태입니다. 이때, 행렬의 압축과 희소성을 확인할 수 있습니다.

# 압축된 형식 확인
print(sparse_matrix1)

# 희소성 확인
density = sparse_matrix1.nnz / (sparse_matrix1.shape[0] * sparse_matrix1.shape[1])
print("Density:", density)

위의 예제에서는 csr_matrix 객체의 nnz 속성을 사용하여 행렬의 비어있지 않은 원소의 개수를 얻어 density를 계산했습니다.

5. 결론

NumPy와 SciPy를 사용하여 희소 행렬을 다루는 방법을 알아보았습니다. scipy.sparse 모듈을 사용하여 희소 행렬을 생성하고, 연산을 수행하며, 희소성을 확인할 수 있습니다. 희소 행렬은 큰 규모의 데이터를 다룰 때 유용하며, NumPy와 SciPy에서 제공하는 희소 행렬 관련 기능은 데이터 분석 및 머신러닝 프로젝트에서 많은 도움을 줄 수 있습니다.

참고 자료