>  기사  >  백엔드 개발  >  희소 저장 및 Python 희소 행렬 변환에 대한 자세한 소개

희소 저장 및 Python 희소 행렬 변환에 대한 자세한 소개

黄舟
黄舟원래의
2017-05-28 10:56:307572검색

이 글에서는 Python 희소 행렬-희소 저장 및 변환 관련 정보를 주로 소개합니다. 필요한 친구들은

sparse 행렬-sparsep

from scipy import sparse

희소 행렬의 저장 형식

을 참고하세요. 공학 분야에서는 선형 모델을 풀 때 많은 대형 행렬이 나타나는 경우가 많습니다. 이러한 행렬의 대부분의 요소는 0이며 이를 희소 행렬이라고 합니다. NumPy의 ndarray array를 사용하여 이러한 행렬을 저장하면 많은 메모리가 낭비됩니다. 행렬의 희박한 특성으로 인해 0이 아닌 요소에 대한 관련 정보만 저장하면 메모리 사용량을 절약할 수 있습니다. 또한 이 특수 구조를 사용하여 행렬에 대한 연산 함수를 작성하면 행렬 연산 속도를 높일 수도 있습니다. scipy.sparse 라이브러리에는 희소 행렬을 표현하기 위한 다양한 형식이 제공되며 각 형식마다 용도가 다르며 그중 dok_matrix 및 lil_matrix는 요소를 점진적으로 추가하는 데 적합합니다.

dok_matrix는 dict

에서 상속

하여 사전을 사용하여 0이 아닌 요소를 행렬에 저장합니다. 사전의 키는 요소(행, 열) 정보를 저장하는 튜플이며 해당 값은 요소 값의 (행, 열) )에 있는 행렬입니다. 분명히 사전 형식의 희소 행렬은 단일 요소의 추가, 삭제 및 액세스 작업에 매우 적합합니다. 일반적으로 0이 아닌 요소를 점진적으로 추가한 다음 빠른 작업을 지원하는 다른 형식으로 변환하는 데 사용됩니다.

a = sparse.dok_matrix((10, 5))
a[2:5, 3] = 1.0, 2.0, 3.0
print a.keys()
print a.values()
[(2, 3), (3, 3), (4, 3)]
[1.0, 2.0, 3.0]
lil_matrix는 두 개의 목록을 사용하여 0이 아닌 요소를 보유합니다. data는 각 행에 0이 아닌 요소를 저장하고, 행은 0이 아닌 요소가 있는 열을 저장합니다. 이 형식은 요소를 한 번에 하나씩 추가하고 행 관련 데이터를 빠르게 검색하는 데에도 적합합니다.

b = sparse.lil_matrix((10, 5))
b[2, 3] = 1.0
b[3, 4] = 2.0
b[3, 2] = 3.0
print b.data
print b.rows
[[] [] [1.0] [3.0, 2.0] [] [] [] [] [] []]
[[] [] [3] [2, 4] [] [] [] [] [] []]

coo_matrix는 row, col, data 세 개의 배열을 사용하여 0이 아닌 요소의 정보를 저장합니다. 세 배열의 길이는 동일하며, row는 요소의 행을 보유하고, col은 요소의 열을 보유하며, data는 요소의 값을 보유합니다. coo_matrix는 요소에 대한 액세스, 추가 및 삭제를 지원하지 않습니다. 일단 생성되면 다른 형식의 행렬로 변환하는 것 외에는 모든 작업이나 행렬 작업을 수행하는 것이 거의 불가능합니다.

coo_matrix는 반복 요소를 지원합니다. 즉, 동일한 행 및 열 좌표가 여러 번 나타날 수 있습니다. 다른 형식의 행렬로 변환하면 동일한 행 및 열 좌표에 해당하는 여러 값이 합산됩니다. 아래 예에서 (2, 3)은 1과 10 두 값에 해당합니다. 이를 ndarray 배열로 변환하면 이 두 값이 합쳐지므로 (2, 3) 좌표의 값은 최종 행렬에서는 11 입니다.

많은 희소 행렬 데이터가 이 형식의 파일에 저장됩니다. 예를 들어 CSV 파일에는 "사용자 ID, 제품 ID, 평가 값"이라는 세 개의 열이 있을 수 있습니다. numpy.loadtxt 또는 pandas.read_csv를 사용하여 데이터를 읽은 후 coo_matrix를 통해 희소 행렬로 빠르게 변환할 수 있습니다. 행렬의 각 행은 사용자에 해당하고, 각 열은 제품에 해당하며, 요소 값은 사용자의 평가입니다. 제품의.

row = [2, 3, 3, 2]
col = [3, 4, 2, 3]
data = [1, 2, 3, 10]
c = sparse.coo_matrix((data, (row, col)), shape=(5, 6))
print c.col, c.row, c.data
print c.toarray()
[3 4 2 3] [2 3 3 2] [ 1 2 3 10]
[[ 0 0 0 0 0 0]
 [ 0 0 0 0 0 0]
 [ 0 0 0 11 0 0]
 [ 0 0 3 0 2 0]
 [ 0 0 0 0 0 0]]

개인 작업에서는 희소 행렬 연산이 필요하기 때문에 coo_matrix를 선택했는데, 다른 형태로 저장하지 않으면 복잡도가 너무 높습니다(시간 및 공간). 1000*1000 행렬은 약 2시간이 걸립니다. 또한 치명적이다. Pajek 소프트웨어의 데이터 입력 형식 삼중항을 생각할 수밖에 없었습니다.

그래서 내 데이터를 유사한 삼중항으로 처리하려고 생각했습니다!

즉, "행렬 행렬"—>"튜플 트리플"—>"sparseMatrix2tuple"—>"scipy.sparse"

위 내용은 희소 저장 및 Python 희소 행렬 변환에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.