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)