2013-05-23 5 views
2

scipy 스파 스 배열 구성시 복사 인수의 기능은 무엇입니까?scipy 스파 스 행렬, 복사 인수

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

아무 것도 보이지 않습니다!

다른 하나에서 스파 스 매트릭스를 구성하고 명시 적으로 copy = False로 설정하면 하나의 매트릭스를 변경해도 다른 하나가 변경되지 않습니다.

import scipy.sparse as sp 
import numpy as np 
A = sp.csc_matrix(np.array([[1,0],[0,0]])) 
B = sp.csr_matrix(A, copy=False) 
B[1,1] = 1 #editing B should change A but it does not 
print A.data, B.data #these values are different 

감사

답변

2

는 모두 CSC와 CSR 행렬은 내부적으로 세 개의 1D 배열로 표시됩니다. 이 세 배열은 동일한 데이터를 나타낼지라도 일반적으로 형식에 따라 다릅니다. 따라서 동일한 데이터를 가리 키지 만 다른 형식으로 액세스하는 행렬 객체를 스파 스해야 할 수는 없습니다.

인수가 허용 할 수있는 것은 동일한 데이터를 가리키는 같은 형식의 두 희소 매트릭스 객체를 갖는 것입니다. 예를 들어 :

는 는 이것은 또한 새로운 배열을 인스턴스화 필요로, 데이터의 공통점을 깰 것이다 희소성 구조를 끊는 CSR (및 CSC) 형식 (들)에 대한 예를 들어, 한계가있다

, 단순히

a = sps.csr_matrix([[1, 0], [0, 0]]) 
b = sps.csr_matrix(a, copy=False) 

>>> a.data 
array([1]) 
>>> b.data 
array([1]) 
>>> a[0, 0] = 2 
>>> a.data 
array([2]) 
>>> b.data 
array([2]) 
변경하지 기존의 것들의 값 :

>>> a[1, 1] = 5 
>>> a.data 
array([2, 5]) 
>>> b.data 
array([2]) 
+0

은 어쩌면 내가 del'의 작동 방식을'이해하지 않지만, 다음은 나 데이터도'복사본 = FALSE '가 지정 복사를 의미한다 : '인쇄 S.todense을 () S2 = sp.sparse.csr_matrix (S, copy = False), ' 'del S.data, S.indices, S.indptr, S; ' 'print S2.todense() # <- 첫 번째 인쇄와 동일 함, ' – gerowam

+1

Python은 모든 객체에 대한 참조 횟수를 유지합니다. 예 : 'del S.data'는 대응하는 배열의 참조 카운트가 1 씩 감소하고'.data' 속성이 객체에서 제거됩니다. 다른 객체가이 동일한 배열을 가리 키지 않으면 참조 카운트가 0으로 떨어지고 가비지 수집됩니다. 그러나 다른 객체가 그것을 가르키면 배열은 가비지 수집되지 않을 것이고, 속성을 제거했기 때문에 더 이상 접근 할 수 없다하더라도'S2'가 사용하기 위해 유지됩니다. – Jaime

관련 문제