2014-08-28 2 views
1

lil_matrix의 속성을 직접 설정하려고하면 예상치 못한 동작이 발생합니다. 다음의 간단한 예에서 어떤 일이 일어나고 있는지 설명 할 수 있습니까?스파 스 lil_matrix는 데이터를 할당 할 수 없습니다

내 특별한 사용 사례는 2를 모듈러로 설정하려고합니다. ie dense-matrix-speak에서 나는 단지 matrix[0] %= 2을하고 싶다.

from scipy import sparse 
import numpy as np 
np.random.seed(0) 

matrix = sparse.rand(10**3,10**3).tolil() 
num_entries = len(matrix[0].data[0]) 
print num_entries 
# 9 

# this throws no errors... 
matrix[0].data[0] = [2]*num_entries 
# but does nothing! 

assert (np.array(matrix[0].data) == 2).all() # FAILS 

# in fact nothing can be done to alter .data directly... 
matrix[0].data[0].pop() # returns the last float from the row 
# but does not actually pop it from the row! 
assert (len(matrix[0].data[0]) == num_entries-1) # FAILS 
+0

'num_entries'의 값은 무엇입니까? 나는'0'을 추측하고있다. 'matrix.data'는리스트의리스트이고,'matrix.data [0]'는 그것들 중 첫 번째 것입니다. 그것은 비어있을 수 있습니다. – hpaulj

+0

위의 코드에서 추가했지만 num_entries는 9입니다. matrix.data는 실제로 목록 인 파이썬 개체의 numpy.array입니다. – gabe

+1

그래서'matrix [i] .data [0] == matrix.data [i]'는 모든'i'에 대해 true이지만,'is' 연산자와 비교할 때 같지 않습니다. – hpaulj

답변

1

I는 객체 matrix[0]의 종류를 확실히 모르겠지만, 난 당신이 matrix에 색인을 삭제 만 data에 그것을 유지하는 의미 생각 :

num_entries = len(matrix.data[0]) 
matrix.data[0] = [2]*num_entries 
+1

이 문제가 해결되었습니다. 나는 _ 행렬 _이'matrix [0]'이 실제로 첫 행의 복사본을 만들어 그것을 새로운 행렬에 넣는 것이라고 생각한다. 그래서 그 데이터를 설정할 때'매트릭스 '를 설정하지 않았습니다. – gabe

0

@vlsd이 버그를 발견 , 그러나 나는 이것을 더해서 더 말할 것이다.

내가 게시 한 코드의 문제점은 matrix[0].data에 (전체)를 지정했다는 것입니다. 문제는 matrix[0]이 조밀 배열과 동일하게 작동하지 않는다는 것입니다. 단순히 동일한 객체를 가리키는 것이 아니라 새로운 객체를 만드는 것입니다 (제 생각에). 그래서이 새로운 객체에 데이터를 할당하는 것은 괜찮지 만, 단지 matrix에는 영향을 미치지 않습니다. 그것이 문제이다.

그래서 다음 코드는 잘 작동이 아마 스파 스 매트릭스의 무결성을 폐허로 목록에서 터지는 것은 일반적으로 좋은 생각

matrix.data[0] = [2]*num_entries 
assert (np.array(matrix.data[0]) == 2).all() # passes 
matrix.data[0].pop() 
assert (len(matrix.data[0]) == num_entries-1) # passes 

NB된다. 그러나 이것은 데모에 불과했습니다. 그리고 이제는 의미가 있습니다.