Python
[NumPy] Broadcasting
잘할수있을거야
2022. 1. 23. 16:38
- general broadcasting rule
꼬리부분의 차원(맨 오른쪽) 부터 시작해 왼쪽방향으로 적용된다.
각 차원에서 사이즈가 큰것이 적용된다.
1. 각 차원에서의 사이즈가 같거나
2. 각 차원에서의 한쪽 배열이 사이즈가 1일때만 적용가능
(없는 차원의 경우 사이즈 1로 간주할 수 있다)
- broadcasting 규칙 확인
1. broadcasting 적용 가능 유무, broadcasting 결과 배열의 shape
a= (3 x 4)
b= (1 x 1)
(마지막 꼬리에 해당하는 차원인 열부터) 4, 1 비교 -> 큰 값 4 -> (행) 3,1 비교 -> 큰 값 3
broadcasting 결과: 3 x 4
a = (3 x 4)
b= (4, ) -> 없는 차원은 비교될 때 1로 간주 (1 x 4)
4, 4 비교 -> 동일 값 4 -> (행) 3,1 비교 -> 큰 값 3
broadcasting 결과: 3 x 4
a = (3 x 4)
b= (3, ) -> (1 x 3)로 간주됨
(마지막 꼬리 열부터) 4, 3 비교 -> 사이즈가 같지 않은데 한쪽이 1이 아니기 때문에 broadcasting이 적용될 수 없다.
a = 3 x 2 x 4 (3,2,4)
b = 4 (4,)
없는 차원은 1로 간주된 뒤 비교
b = 1 x 4 -> 2 x 4
없는 차원은 1로 간주된 뒤 비교
b = 2 x 4 -> 1 x 2 x 4
broadcasting 결과: 3 x 2 x 4
a= 1 x 2 x 1 x 7
b= 3 x 1 x 8 x 1
broadcasting 결과: 3 x 2 x 8 x 7
- broadcasting 테스트
# (3,) -> (1 x 3)
a = np.array([1, 2, 3])
print(a)
print()
# (7 x 1)
b = np.array([[1],
[2],
[3],
[4],
[5],
[6],
[7]])
print(b)
print()
# (7 x 3)
# a 의 1,2,3이 7개의 행으로 확장
# b 의 1이 3개의 열로 확장, 2가 3개의 열로 확장 .....7이 3개의 열로 확장
print(a + b)
# 2 x 2 x 3
a = np.array([[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]]])
# 1 x 3
b = np.array([[1, 2, 3]])
''' 2 x 3
1 2 3
1 2 3
...
''' 2 x 2 x 3
1 2 3
1 2 3
1 2 3
1 2 3
'''
# 2 x 2 x 3
print('a+b')
print(a + b)
# 3 x 1 -> 3 x 6
a = np.array([[1],
[2],
[3]])
'''
1 1 1 1 1 1
2 2 2 2 2 2
3 3 3 3 3 3
'''
# 1 x 6 -> 3 x 6
b = np.array([[1, 2, 3, 4, 5, 6]])
'''
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
'''
# 3 x 6
print('a+b')
print(a + b)