이번 시간에는 numpy에서의 broadcasting에 대해서 이해해보고 활용해보도록 하자.
broadcasting은 numpy에서 가장 중요한 개념 중 하나이다. 중요하다고 딱히 어려운 건 아니다.
이전에 우리가 ndarray 연산을 할 때 shape이 같은 모양끼리만 연산이 가능했던 것을 기억해보자.
broadcasting 개념은 shape이 같지 않은 모양의 ndarray 연산을 가능하게 한다.
1. shape이 같은 경우의 연산
# <in>
x = np.arange(15).reshape(3, 5)
y = np.arange.rand(15).reshape(3, 5)
print(x)
print(y)
# <out>
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
[[0.34997891 0.58655739 0.73100157 0.2602576 0.75453137]
[0.73919771 0.10252731 0.16813945 0.24471329 0.01751087]
[0.97450968 0.52360322 0.76663493 0.57228713 0.879039 ]]
x, y와는 3X5 2차원 행렬이다. 같은 shape을 가지고 있기 때문에 연산에서 자유롭다.
2. scalar와의 연산
이 행렬과 모양이 다른 scalar(상수)와의 연산을 실행해보자.
# <in>
x = np.arange(15).reshape(3, 5)
y = np.random.rand(15).reshape(3, 5)
print(x * 2)
print(y + 2)
print(x ** 2)
print(x % 2)
# <out>
[[ 0 2 4 6 8]
[10 12 14 16 18]
[20 22 24 26 28]]
[[2.26221566 2.30087131 2.02539978 2.30306256 2.24207588]
[2.55757819 2.56550702 2.47513225 2.29279798 2.06425106]
[2.97881915 2.33970784 2.49504863 2.97708073 2.44077382]]
[[ 0 1 4 9 16]
[ 25 36 49 64 81]
[100 121 144 169 196]]
[[ True False True False True]
[False True False True False]
[ True False True False True]]
스칼라를 각 원소에 더하거나 곱한 결과값이 나오는 것을 확인할 수 있다.
3. shape이 다른 경우의 연산
# <in>
a = np.arange(12).reshape(4, 3)
b = np.arange(100, 103)
c = np.arange(1000, 1004)
d = b.reshape(1, 3)
print(a.shape)
print(b.shape)
print(c.shape)
print(d.shape)
print(d)
# <out>
(4, 3)
(3,)
(4,)
(1, 3)
[[100 101 102]]
여기서 broadcasting 개념이 나오는데 연산하려는 것의 shape의 뒷 차원에서 부터 비교하여 shape이 같거나 차원이 1인 것이 존재하면 가능하다.
예를 들어 a의 shape은 4행 3열(4, 3) 행렬이고, b의 shape은 3행 1열(3, 1) 벡터이다. 이런 경우에는 뒷 차원부터 비교했을 때 b의 뒷차원이 1이고 3행이 a의 3열과 같기 때문에 연산이 가능해진다. 이 경우에 b를 1행 3열 벡터로 취급하고 a의 모든 행에 b의 값을 더해주는 것으로 보인다.
또 다른 경우의 a와 d를 보면 d의 모양이 1행 3열 행렬로 이 경우는 b의 열과 a의 열이 같기 때문에 연산이 가능해지고 결과는 a + b와 같다.
원래 행렬을 곱할 때에는 무조건 더할 대상의 열과 더하는 것의 행의 숫자가 같아야 연산이 가능했는데 numpy ndarray에서는 약간 다른 개념이 적용되는 것 같다. 참고해두자.
'python > numpy' 카테고리의 다른 글
9. linalg 로 선형대수 연산하기 (0) | 2023.02.16 |
---|---|
8. boolean indexing (0) | 2023.02.16 |
6. axis의 이해 - axis를 파라미터로 갖는 함수 - (0) | 2023.02.16 |
5. numpy ndarray 기본함수 사용 (0) | 2023.02.15 |
4. ndarray -데이터 형태 바꾸기(reshape,flatten)- (0) | 2023.02.15 |