브로드캐스팅
- 규칙
- 차원 수가 다르면 차원이 작은 배열 앞에 1인 차원을 추가
- 대응하는 차원의 크기가 같거나 둘 중 하나가 1이어야 함
- 확장 시 크기 1인 차원이 해당 위치의 다른 배열 차원 크기로 반복됨
위 코드 사례 분석
- a 변환: (5, ) → (1,5) → (3,5)로 변환
- b와 element wise하게 연산
- ※ 영상 제작용 코드는 댓글 다시면 메일로 보내드릴게요!
a = [0, 1, 2, 3, 4] # a.shape == (5,)
b = [[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]] # b.shape = (3, 5)
c = a+b
c = [[ 0, 2, 4, 6, 8],
[ 5, 7, 9, 11, 13],
[10, 12, 14, 16, 18]] # c.shape: (3, 5)
어려운 사례 분석
(jnp.arange(5)[None] < jnp.array(2)[None, None]).shape
(jnp.arange(5)[None, None] < jnp.array(2)[None]).shape
- 첫 번째 표현식 분석:
jnp.arange(5)[None] < jnp.array(2)[None, None]
jnp.arange(5)[None]
의 shape: (1, 5)
arange(5)
는 [0,1,2,3,4]
로 shape (5,)
[None]
은 차원을 추가해 [[0,1,2,3,4]]
로 shape (1, 5)
가 됨
jnp.array(2)[None, None]
의 shape: (1, 1, 1)
array(2)
는 스칼라값 2
로 shape ()
[None, None]
은 차원을 두 개 추가해 shape (1, 1, 1)
이 됨
- 브로드캐스팅 적용:
(1, 5)
vs (1, 1, 1)
- 차원 수가 다르므로 작은 쪽 앞에 1 추가:
(1, 1, 5)
vs (1, 1, 1)
- 대응 차원 비교:
(1=1, 1=1, 5≠1)
→ 세 번째 차원에서 1
이 5
로 확장
- 최종 shape:
(1, 1, 5)
두 번째 표현식 분석:
jnp.arange(5)[None, None] < jnp.array(2)[None]
jnp.arange(5)[None, None]
의 shape: (1, 1, 5)
arange(5)
는 shape (5,)
[None, None]
은 차원을 두 개 추가해 shape (1, 1, 5)
가 됨
jnp.array(2)[None]
의 shape: (1, 1)
array(2)
는 스칼라 2
로 shape ()
[None]
은 차원을 하나 추가해 shape (1, 1)
이 됨
- 브로드캐스팅 적용:
(1, 1, 5)
vs (1, 1)
- 차원 수가 다르므로 작은 쪽 앞에 1 추가:
(1, 1, 5)
vs (1, 1, 1)
- 대응 차원 비교:
(1=1, 1=1, 5≠1)
→ 세 번째 차원에서 1
이 5
로 확장
- 최종 shape:
(1, 1, 5)
두 경우 모두 최종 결과 shape은 (1, 1, 5)
이지만, 과정에서 브로드캐스팅이 다르게 적용됩니다.
첫 번째는 (1, 5)
가 (1, 1, 5)
로 확장되고, 두 번째는 이미 (1, 1, 5)
이므로 다른 배열이 맞춰집니다.