2016-07-07 2 views
1

나는 csr_matrix이,이 전이라고 가정 해 봅시다 : csr_matrix에 요소를 추가하는 올바른 방법은 무엇입니까?

import scipy.sparse as ss 
mat = ss.csr.csr_matrix((50, 100)) 

이 지금은이 행렬의 값의 일부를 수정할. 나는 전화 :

mat[0,1]+=1 

내가 얻을 :

SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient. 

난 그냥 행렬의 작성 후 (마지막에서 매트릭스의 규모에서) 몇 가지 값을 설정하기 만하면됩니다. 나중에 열을 읽거나 전체 행렬 (예 : .log1p())에 대한 요소 별 작업을 수행합니다.

올바른 방법은 무엇입니까? 현재 경고를 무시할 수 있지만 더 좋은 방법이있을 수 있습니다. 경고를 내지 않습니다.

+0

CSR 및 CSC는 빠른 선형 대수 계산에 선호되는 형식입니다. 일반적으로 행렬을 COO, LIL 또는 DOK로 구성하고 CSC 또는 CSR로 변환 한 다음 비싼 수학을 수행합니다. 유스 케이스를 더 잘 이해하는 데 도움이 될 것입니다. 매트릭스로 무엇을하고 싶습니까? 비싼 작업 사이에 새 데이터를 추가해야합니까, 아니면 처음에 추가 작업을 수행 할 수 있습니까? – Jaime

+0

수정되었습니다. 더 명확히되기를 바랍니다. –

+0

[COO 매트릭스] (http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.coo_matrix.html)를 만들고 값을 추가 한 다음 CSC 또는 CSR 매트릭스를 사용하면 작업 속도가 향상됩니다. 이후에 모두 elementwise 연산을 사용하면 COO가 정상적으로 작동합니다. 열을 추출하려면 CSR을 선택하고 CSC를 선택하십시오. – Jaime

답변

0

경고 모양을 제어 할 수 있습니다. 기본값은 실행 중에 한 번 표시 한 다음 잠잠 해지는 것입니다. 오류를 발생 시키거나, 소리가 전혀 들리지 않거나, 매번 경고를 내기 위해이를 변경할 수 있습니다.

희소 행렬을 만드는 일반적인 방법은 모든 0이 아닌 값을 사용하여 3 coo 스타일 배열을 만드는 것입니다. 그런 다음 coo 행렬 또는 csr을 직접 만듭니다 (동일한 스타일의 입력을 사용함).

coo 형식은 색인 생성이 없으므로 어쨌든 M[i,j]=1을 수행 할 수 없습니다. 그러나 csr이이를 구현합니다. 나는 경고가 하나 또는 둘이 아닌 여러 변화를 (루프에서) 방해하는 것이라고 생각한다.

csr 행렬의 희소성을 변경하려면 전체 속성 집합 (데이터 및 색인 포인터)을 다시 계산해야합니다. 그것이 비싼 이유입니다. 타이밍을 완료하지는 못했지만 어레이를 신선하게 만드는 것만 큼 값이 비쌀 수도 있습니다.

lil은 증 분식 할당의 경우 더 좋습니다. 데이터를 목록의 목록에 보관하고 목록에 값을 삽입하는 것이 빠릅니다. 그러나 csrlil으로 변환하고 돌아 오는 데는 시간이 걸리기 때문에 몇 가지 추가 작업을 수행하지는 않습니다.

+0

나는 경고 모양을 바꾸고 싶지 않다. 나는 일을 올바르게하고 싶다. 현재 나는 희소성을 바꾸라고 요구하지는 않지만 어쨌든 그것이 일어나는 것처럼 보입니다. 왜 그런지 궁금합니다. –

+0

일부 추가 형태로 인해이 경고가 발생할 수도 있습니다. – hpaulj

+0

그래도 전체 행렬을 희소하게 재구성하는 것만 큼 나쁘지 않습니까? 아니면 거짓 경고일까요? 당신이 제안하는대로 3 개의 벡터를 만드는 것은 실제로 그렇게 저렴하지 않기 때문에, 상황이 나아지지 않으면 그것을 바꾸고 싶지 않습니다. –