2017-09-04 11 views
1

for 루프에서 벡터화 된 numpy 조작으로의 아주 간단한 전환에서 버그를 알아낼 수 없습니다. 코드는 다음과 같은python for-loop와 3 차원 numpy 행렬 추가 사이의 동일성

for null_pos in null_positions: 
     np.add(singletree[null_pos, parent.x, :, :], 
      posteriors[parent.u, null_pos, :, :], 
      out=singletree[null_pos, parent.x, :, :]) 

는 2D 매트릭스 사이의 간단한 추가이기 때문에, 내가이 3D 또한 것은이

np.add(singletree[null_positions, parent.x, :, :], 
      posteriors[parent.u, null_positions, :, :], 
      out=singletree[null_positions, parent.x, :, :]) 

로 일반화, 결과가 차이가 나타납니다! 왜 그걸 볼 수 있니?

감사합니다!

업데이트 :

singletree[null_positions, parent.x, :, :] = \ 
      posteriors[parent.u, null_positions, :, :] + 
      singletree[null_positions, parent.x, :, :] 

문제가 해결 것으로 보인다. 이 작업은 추가 작업과 관련하여 어떤 차이가 있습니까?

+0

입력 배열의 모양은 무엇입니까? –

+0

다음과 같이 가정 할 수 있습니다. singletree는 L x M x C x (C + 1) 행렬이고, posteriors는 N x L x C x (C + 1)입니다. 그것이 치수에 의존하지 않기 때문에 내 업데이 트를 봐라 (나는 1 분 안에 올릴 것이다), 나는 믿는다. – diningphil

답변

1

문제는 basic indexing 반대로 당신이 (advanced indexing를 사용하고 있기 때문에 통과 out=singletree[null_positions, parent.x, :, :]이 반환, singletree의 부분의 복사본을 만드는 것입니다 (떨어져 새로운 매트릭스를 할당에서, 나는 의미 론적 측면에서 관심이 있어요) 보기). 따라서 결과는 완전히 다른 배열에 쓰여지고 원본은 수정되지 않은 상태로 유지됩니다.

그러나, you can use advanced indexing to assign values. 가장 적합한 구문은 다음과 같습니다.

singletree[null_positions, parent.x, :, :] += \ 
    posteriors[parent.u, null_positions, :, :] 

중간 배열의 사용을 최소화합니다.

+0

고마워! 어리석은 실수 :) – diningphil

+0

@diningphil 내게 어리석은 것처럼 보이지는 않는다. 코드가 완벽하게 합리적 이었지만, 배열을 색인하기 위해 정확히 무엇을 사용하는지에 따라 "작동하지"않는다. 그것에는 이유가 있지만 이런 함정은 NumPy보다 더 자주 발생합니다. – jdehesa

+0

나는 당신과 동의한다, 이들은 까다로운 상황이다. – diningphil