다음의 세 가지 과정을 통해 Broadcasting에 대해 알아보자.
1) 일차원 배열 + 스칼라
2) 2차원 배열 + 일차원 배열
3) Broadcasting
1. 1차원 배열 + 스칼라
a = np.arange(4)
s = 10
b = a + s
print(a.shape)
print(b.shape)
## 출력
(4,)
(4,)
앞선 포스팅에서도 언급했지만 Vectorization을 통해 연산이 빠르게 수행된다.
2. 2차원 배열 + 1차원 배열
a = np.arange(8).reshape(2,4)
b = np.arange(4)
c = a+b
print(f'a.shape:{a.shape}, b.shape:{b.shape}')
print(f'c.shape:{c.shape}')
## 출력
a.shape:(2, 4), b.shape:(4,)
c.shape:(2, 4)
놀랍게도 Error가 발생할거 같았던 차원이 다른 배열 간에 연산이 수행된다.
2번째 연산에서는 numpy의 Broadcasing이 적용되어 연산을 가능하게 한다.
3. Broadcasting
Broadcasting의 개념
- Numpy 고유의 자동화 계산 방식
- 다른 shape의 array들을 적합시켜서 계산을 수행하는 것
- 연산 속도 향상 목적(looping 회피하고 vectorization으로 연산 수행)
- C로 compile됨
아래의 그림과 같이 A가 (2,2) 행렬이고 x가 스칼라 값일 때 아래와 같이 x가 확장되어 연산된다.
스칼라 값인 2가 (2,2)행렬로 확장되는 것을 Broadcasting이라고 하고 Broadcasting되어 벡터끼리 연산할 수 있는 연산방법을 vectorization이라고 생각하면 된다.
스칼라 값 뿐만 아니라 n차원 행렬끼리도 Broadcasting이 내부적으로 적용되어 연산된다.
1차원 행렬의 원소 10, 11, 12가 Broadcasting이 적용되어 내부적으로 (3,3)인 2차원 행렬로 적용되어 연산된다.
4. Broadcasting rule
Rule1. 차원이 부족한 경우 1로 채운다.
Rule2. 동일 차원의 shape이 다르면 shape이 1인 것을 더 큰 수로 변경한다(stretch)
Rule3. shape이 같지 않고 1도 아닌 경우에는 Error가 발생한다.
위와 같이 차원이 다른 a,b,c 행렬이 있고 3개의 행렬을 계산할 때 적용되는 Broadcasting 과정을 따라가보자.
겉으로만 보면 a의 차원이 가장 크므로 만약 Broadcasting이 된다면 최종 결과도 5차원일 것이다.
[행렬 b]
1. 차원을 맞춘다.
3차원이므로 Rule1에 따라 부족한 차원을 1로 채운다.
5차원이 된 b의 shape은 (1,1,3,1,4) 가 될 것이다.
2. shape을 맞춘다. (각 차원별 원소의 개수를 맞춘다)
Rule2에 따라 행렬 a와 b에서 각각 shape이 1인 것을 더 큰수로 변경한다.
- a는 3차원 shape을 3으로 변경
- b는 2,4,5,차원 shpae을 각각 더 큰수(a의 shape)인 8,5,2로 맞춘다.
Rule2까지 적용한 a,b의 shape은 모두 (2,5,3,8,4)가 된다.
shape이 동일하므로 Broadcasting이 끝나고 vectorization방식으로 연산을 수행할 수 있다.
[행렬 c]
Broadcasting이 된다는 사실을 알고 있으니 (2,5,3,8,4)에 맞춰서 Broadcasting을 적용해보자
1. 차원을 맞춘다.
행렬 c는 4차원이므로 부족한 차원을 1로 채워 5차원으로 만들어준다.
5차원이 된 c의 shape은 (1,5,1,8,1)이다
2. shape을 맞춘다.(각 차원별 원소의 개수를 맞춘다.)
Rule2에 따라 행렬 c와 result에서 shape이 1인 것을 더 큰수로 변경한다.
- c는 1,3,5 차원을 각각 4,3,2 로 변경
- result는 1이 없어서 변경할 수 없음
Rule2까지 적용한 c의 shape은 result와 같은 (2,5,3,8,4)가 된다.
따라서 차원이 다른 행렬 a,b,c는 Broadcasting이 가능하고 vectorization으로 연산이 가능하다.
[Broadcasting이 불가능한 경우]
## Broadcasting이 불가능한 경우
a = np.arange(24).reshape(2,3,4)
b = np.ones((3,1))
c = np.zeros((1,2))
d = a+b+c
Broadcasting rule을 적용하다 보면 (2,3,4) (1,2) shape간의 연산이 불가능 하다는 것을 알 수 있다.
*가끔 배수면 바꿀수 있지 않을까 라고 생각할 수 있는데 불가능하다. 반드시 1만 더 큰수로 바꿀 수 있다.
따라서 위의 경우 1차원에서 2가 4로 바뀔수 없고 1도 아니므로 차원을 늘려볼 필요도 없이 Broadcasting이 불가능하다.
연습으로 다음을 Broadcasting 해보면 좋을 거 같다.
정답은 가능하다 이다.
#### 다음 Broadcasting 이 가능한지 확인
- a = np.ones(48).reshape(2,3,2,4)
- b = np.ones(24).reshape(3,2,4)
- c = np.ones(12).reshape(2,3,2,1)
- d = np.ones(12).reshape(3,1,4)
- e = np.ones(6).reshape(3,2,1)
- s = a+b+c+d+e
'💂군대 > KAIST ICT Academy' 카테고리의 다른 글
[데이터 분석 Numpy] Array manipulation (0) | 2024.11.02 |
---|---|
[데이터 분석 Numpy] Numpy Arrays (0) | 2024.11.02 |
[후기] 군 장병 KAIST ICT Academy 수료 (7) | 2024.11.02 |
M12 - 에러 핸들링 (1) | 2024.10.13 |
M11 - 상속과 오버라이딩 (0) | 2024.10.12 |