2016-11-29 4 views
2

) 최근에 numpy로 브로드 캐스트 할 때 다음 문제가 발생했습니다. 결과가 (100,1) 벡터 것이 - numpy의 (N, 1) 배열로 방송 (

y = randn(100) 
x = randn(100,1) 
(y+x).shape 
> 100,100 

나는이 https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html의 규칙에 따라 것을 깨닫게하는 동안

, 하나가 기대하는 것과 카운터 직관적 인 것 같다.

저는이 동작에 대한 좋은 이유가 있습니까 (예 : 동작이 바람직 함) - 방송 규칙이 정의 된 방식의 부산물인지 궁금합니다.

+0

'y + x.T'는 원하는 것을 제공 할 수 있습니다. –

답변

2

기본 생각은 하나 또는 다른 배열에서 결과 모양을 만들기 위해 반복이 필요하면 주요 축의 각 항목에 대해 반복적으로 작업을 수행한다는 것입니다 (별도로 NumPy는 반복을 발생시키는 방법을 제공합니다 원하는 경우 다른 축 위로 이동하십시오 (예 : einsum).

이 경우 x은 장축에 따라 100 가지의 항목이 있으며, 각 항목은 y에 개별적으로 추가됩니다. 그냥 첫 번째 값인 x[0]을 가져와 y에 추가합시다. 이제 우리는 y에 대해 x[0]에 반복적으로 추가되는 100 개의 항목을 가지므로 결과는 모양이 y 일입니다. x[1] 등의 작업을 반복합니다.

x.T을 수행하면 x의 주요 축을 따라 길이가 100 인 "행"이 하나만 있습니다. 그러면 수정없이 y에 요소별로 추가 할 수 있으므로 더 이상 브로드 캐스팅 할 필요가 없으며 마음에 들었을 수도있는 "순진한"벡터 연산을 얻게됩니다.

NumPy의 브로드 캐스팅 규칙은 선형 대수학 또는 공통 벡터/행렬 연산과 전혀 관련이없는 다양한 계산 및 연산을 통해 프로그래밍 및 반복에 효과적 이도록 노력하고 있습니다. 따라서 방송은 항상 선형 대수학의 기대에 대한 특권을 부여하기 위해 항상 가정하지는 않습니다.