배워서 남 주자

개발 및 개발환경/Python

[Numpy] Matrix에 Vector를 Broadcasting하기

신라면순한맛 2022. 9. 19. 22:25

원래 수학에서는 당연히 같은 공간에 있는 것들끼리만 연산이 가능하지만, python의 세계에서는 어떤 의미에서는 직관적으로 broadcasting이라는 기능을 제공하죠. 특히 numpy array가 연산에 대해서 좀 더 직관적인 기능을 수행하게끔 해줍니다.

 


 

예를 들어 numpy array에서 scalar를 연산해주면, 아래의 예처럼 broadcasting이 일어납니다.

import numpy as np

np_arr = np.array([1, 2, 3, 4, 5])
sclr = 3

print(np_arr * sclr)		
# array([3, 6, 9, 12, 15])

 

여기까지는 아마 모두 잘 아시리라 생각합니다.

 

hierarchy를 하나 올려서, 2d-array (matrix)에 1d-array (vector)를 broadcasting를 해줄 수 있을까요? 위와 똑같이 해보면 사실 잘 안됩니다.

import numpy as np

np_mat = np.array([[1, 2, 3],[4, 5, 6]])
np_vec = np.array([10, -10])

print(np_mat * np_vec)	
# ValueError: operands could not be broadcast together with shapes (2,3) (2,)

 

기대했던 결과는 array([10,20,30], [-40, -50, -60]])였는데, shape에 문제가 있다면서 진행이 잘 되지 않습니다.

 

 

이럴 때에는 np_vec 쪽의 dimension을 np_mat에 맞춰주면 해결됩니다.

import numpy as np

np_mat = np.array([[1, 2, 3],[4, 5, 6]])
np_vec = np.array([10, -10])

# shape 조절
np_vec = np_vec[:, None]			

# 윗 줄과 같은 연산
# np_vec = np.expand_dims(np_vec, axis=-1)	


print(np_mat.shape, np_vec.shape)		
# (2, 3), (2, 1)

print(np_mat * np_vec)				
# array([[10, 20, 30],
#   	 [-40, -50, -60]])

 

이렇게 dimension을 np_mat에 맞춰주면 원하는대로 broadcasting이 가능합니다.