2010-04-20 5 views
4

길이가 m 인 편평한 numpy 배열을 추가하려는 scipy.sparse.dok_matrix (차원 m x n)이 있습니다. 가 아닌 기존의 키 (del self[(i,j)])을 삭제하려고 할 때scipy.sparse.dok_matrix에 numpy 배열 추가

for col in xrange(n): 
    dense_array = ... 
    dok_matrix[:,col] = dense_array 

그러나,이 코드는 dok_matrix.__setitem__에서 예외를 발생시킵니다.

그래서, 지금은 이것을 unelegant 방법을하고있는 중이 야 위해 :

for col in xrange(n): 
    dense_array = ... 
    for row in dense_array.nonzero(): 
     dok_matrix[row, col] = dense_array[row] 

을하므로 매우 비효율적을 느낀다. 그럼, 가장 효율적인 방법은 무엇입니까?

감사합니다.

답변

2

당신의 어색한 방식은 슬라이스 방식과 같은 문제가 없다는 것에 놀랐습니다. 이것은 Scipy 코드를보고 나에게 버그처럼 보입니다. 이미 0 일 때 dok_matrix의 특정 행과 열을 0으로 설정하려고하면 존재하는 지 확인하지 않고 해당 행과 열의 값을 삭제하려고 시도하기 때문에 오류가 발생합니다.

귀하의 질문에 대한 답변에서, 당신이 당신의 세련되지 못한 방식으로하는 일은 정확히 두 가지 isinstance 점검을 한 후 어떤 좋은 방법으로하지 않는지 정확히 __setitem__ 방법입니다. 당신이 우아한 방법을 사용하려는 경우, 당신은 내가 그런

if value==0 and self.has_key((i,j)): 

if value==0: 

에서 라인 (222)을 Lib/site-packages/scipy/sparse/에 dok.py을 열고 변경하여 자신의 Scipy 패키지에 언급 된 버그를 해결할 수 있습니다 당신은 우아한 방법을 사용할 수 있으며 잘 작동합니다. 버그 수정을 제출했지만이 버전은 이미 다음 버전에서 수정되었으며 수정 된 방법입니다.

+0

에서 수정되었습니다 생각합니다. 감사합니다. – PhilS

+0

Doh, 놓 쳤지만 기꺼이 도와 줄 수있었습니다. –

+0

side-note : 키 (i, j)가 아직 존재하지 않으면 'dok_matrix'에 제로 값이 설정되어 있으므로 위의 dok.py에있는 코드가 버그라고 생각합니다. 티켓 (http://projects.scipy.org/scipy/ticket/1160)을 열었습니다. 또한, "dense_array"가 희박한 경우 "0"이 아닌 값만 검사하고 삽입해야합니다 ('__setitem__' 만 호출해야 함). 그래서 내가 언급 한 사람이 더 아름답더라도 나는 나의 오래된 버전을 고수한다. – PhilS

1

나는이 버그는 "unelegant"방법은`dense_array.nonzeros()가 충돌하지 않는 이유`dok_matrix에 값을 삽입하기 전에, 그건로 0을 필터링 Scipy 0.8.0

+0

네, 맞습니다. – PhilS