원래 수학에서는 당연히 같은 공간에 있는 것들끼리만 연산이 가능하지만, 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이 가능합니다.
'개발 및 개발환경 > Python' 카테고리의 다른 글
[Pandas] 특정 list내에 있는 것들로만 추출하려면? isin! (0) | 2022.10.14 |
---|---|
[Python] List 내의 중복된 element 제거하기 (0) | 2022.09.21 |
[Numpy] np.stack에 대한 이해 (0) | 2022.09.20 |