[numpy #3] Broad casting에 대해서 알아보자

2019. 4. 17. 10:57Programming Tutorial/Python

필자가 궁금한 순으로 공부하고 남기는 것이므로 순서가 뒤죽박죽일순 있다.

 

각설하고 시작하자.

 

Numpy는 차원/모양이 다른 array간의 산술연산을 할때 broad casting이라는 mechanism을 사용한다.

 

일단 개념적으로 예를 한번들어보자.

 

[2,4,6,8] 이라는 4개 원소를 가지는 array와 scalar 2를 곱하는 과정을 개념화한 아래의 그림을 참고하면

 

쉽게 broad casting에 대해서 이해할수 있다.

 


 

Figure 1: Broadcasting example of adding a scalar to a vector (or 1-D array)


 

array와 scalar 연산 뿐만 아니라 matrix간의 연산에도 해당 내용은 확장되어 적용된다.

 

다만 모든경우에 broad casting이 가능한 것은 아니다.

 

Trailing axes 사이즈가 일치하거나 연산 대상중 하나가 1이어야 한다.


 

Figure 2: Matrix broadcasting example

 


 

이제 코드로 예시를 한번 뜯어봅시다.

 

# create a 4 X 3 matrix of random integers between 1 and 10
> A = np.random.randint(1, 10, [4, 3])
> A
'Output': 
array([[9, 9, 5],
       [8, 2, 8],
       [6, 3, 1],
       [5, 1, 4]])
# create a 4 X 1 matrix of random integers between 1 and 10
> B = np.random.randint(1, 10, [4, 1])
> B
'Output': 
array([[1],
       [3],
       [9],
       [8]])
# add A and B
> A + B
'Output': 
array([[10, 10,  6],
       [11,  5, 11],
       [15, 12, 10],
       [13,  9, 12]])

 

위와는 다르게 broad casting 조건을 만족하지 않는다면. error를 출력합니다.

 

아래를 봅시다.

 

A      (2d array):  4 x 3       
B      (2d array):  4 x 2
The dimensions do not match - they must be either the same or 1

 

> A = np.random.randint(1, 10, [4, 3])
> B = np.random.randint(1, 10, [4, 2])
> A + B
'Output': 
Traceback (most recent call last):

  File "<ipython-input-145-624e41e41a31>", line 1, in <module>
    A + B

ValueError: operands could not be broadcast together with shapes (4,3) (4,2) 

 

머신러닝 공부시 해당 개념 이해가 꽤 도움이 될듯 합니다.

 

자 오늘도 커피한잔 마시면서.. 마무리하죠.