2016-08-31 3 views
3

나는 NumPy가 ndarray이고 모양이 (32, 1024)이며 32 신호 측정을 보유하고 있으며, 32. 각기 다른 체중을 가졌지 만 numpy.average을 사용했지만 내 체중이 복잡하고 average은 내 결과를 버리는 합계를 기반으로 체중의 정상화를 수행합니다.NumPy ndarray 방송 - 모양 (X,) vs (X, 1)

평균에 대한 코드를 보면 신호 배열에 가중치를 곱한 다음 첫 번째 축을 합산하여 동일한 결과를 얻을 수 있다는 것을 깨달았습니다. 그러나 (32, 1024) 신호 배열로 내 (32,) 가중치 배열을 시도하고 곱하면 (32,)가 (32, 1024)로 브로드 캐스팅 될 수 없으므로 치수 불일치가 발생합니다. 나는에 무게 배열 바꿀 경우 예상대로 (32, 1) 다음 모든 그러나이 오히려 추한 코드의 결과를 작품 :

avg = (weights.reshape((32, 1)) * data).sum(axis=0) 

NumPy와 내 (32) 배열에 방송을 허용하지 않습니다 왜 아무도 설명 할 수 (32, 1024) 그리고/또는 가중 평균을 수행 할 수있는 대안을 제시 할 수 있습니까?

+1

numpy는'(1, 32)'에서'(1024,32)'까지 확장 할 수 있습니다. 그러나'(32,)'를'(32,1)'로 확장 할 권한을 주어야합니다. 이렇게하면 a (32,)에 a (1024,)를 곱한 경우와 같이 다른 상황에서 모호함을 피할 수 있습니다. 내 최근 답변에서 이것에 대한 자세한 내용은 http://stackoverflow.com/a/39238203/901925 – hpaulj

답변

4

(32,)(32, 1024)으로 브로드 캐스팅 할 수없는 이유는 모양이 제대로 정렬되지 않았기 때문입니다. 개략적으로 말하면, 우리는이 :

weights :   32 
data : 32 x 1024 

우리는 data의 첫 번째 축에 정렬 weights의 첫 번째 축입니다 만 축, 정렬해야합니다. 따라서, 한 가지 방법이 reshape에서 2D으로가는 것을 발견 했으므로 두 번째 축으로 단일 차원으로 끝납니다. 우리가 가진 것 수정 된 버전으로 다시 설계도로 돌아가서 :

weights : 32 x 1 
data : 32 x 1024 

지금, 모양이 정렬되어 있는지, 우리가 그 elementwise 작업을 수행 할 수 있습니다.

우리는 명시 적으로 None/np.newaxis와 함께 그 새로운 축을 소개 할 수있어 너무처럼 reshaping 교체 -

(weights[:,None]*data).sum(0) 

은의 깔끔한 대안을 살펴 보자! 우리가 같이 data의 첫 번째 축에 대해 weights의 첫 번째 축을 잃게, 행렬 곱셈이 np.dot을 사용하여이 될 것

np.einsum('i,ij->j',weights,data) 

또 다른 방법 -

한 단정하고 아마 직관적 인 방법은 np.einsum 함께 할 것 -

weights.dot(data) 
+0

명확하고 철저한 대답, 감사합니다. 저는'np.einsum '에 대해서 몰랐습니다. 문법에 익숙하지 않은 사람들에게는 그것이 깔끔하지 않다고 생각합니다. 'np.dot' 스타일은 "그냥 이해할 만하다"는 것과 더 잘 어울립니다. –