[Python] (6) Numpy broadcasting (브로드캐스팅)
Numpy broadcasting
벡터의 내적을 구할 때는 차원이 서로 같아야만 하는 조건이있었습니다.
하지만 이번 브로드캐스트는 다른 차원의 연산이 가능한 점에서 차이가 있습니다.
우선 3가지 방법을 소개해드리면 다음과 같습니다.
1번 for문 // 2번 tile 함수 이용 // 마지막으로 자동 브로드 캐스팅 방법이있습니다.
numpy.empty(배열, dtype='조건')
- 특정한 값으로 초기화하지 않는 배열을 생성
numpy.empty_like(배열, dtype='조건')
- 배열의 크기와 동일하며 특정한 값으로 초기화하지 않는 배열을 생성
import numpy as np
x = np.arange(1, 10).reshape(3,3)
y = np.array([1,0,1])
z = np.empty_like(x)
print(x, end='\n\n')
print(y, end='\n\n')
print(z, end='\n\n')
# x + y
for i in range(3):
z[i] = x[i] + y
print(z, end='\n\n')
# 방법 2 tile()
kbs = np.tile(y, (3,1))
print(kbs, end='\n\n')
z = x + kbs
print(z, end='\n\n')
# 방법 3 nuympy 의 broadcast
mbc = x + y
print(mbc + 100, end='\n\n')
# 출력 결과
[[1 2 3]
[4 5 6]
[7 8 9]]
[1 0 1]
[[1 2 3]
[4 5 6]
[7 8 9]]
[[ 2 2 4]
[ 5 5 7]
[ 8 8 10]]
[[1 0 1]
[1 0 1]
[1 0 1]]
[[ 2 2 4]
[ 5 5 7]
[ 8 8 10]]
[[102 102 104]
[105 105 107]
[108 108 110]]
x 행렬을 다음과 같이 주고 empty_like 함수를 사용하여 z 행렬을 그대로 복사하였습니다.
이후, 1번 방법 for문을 사용한 경우 각 행의 자리에 맞춰 1차원 배열인 y 값들을 더해 준 것을 확인 할 수 있습니다.
방법 2번 tile을 이용하여 구조를 맞추는 방식으로 3행과 길이는 1로 2차원 배열을 생성한 후 z 배열에 더한 것입니다.
만약 길이를 2로 주었다면 [ 1 0 1 1 0 1 ] 이 3행까지 반복되어서 출력되었을 것입니다.
방법 3번 자동 브로드 캐스팅 사용
자동으로 자리를 맞추어 값을 계산하여 출력합니다.
# broadcast ex
v = np.array([1,2,3])
w = np.array([4,5])
print(np.reshape(v, (3,1))*w, end='\n\n')
print(np.reshape(w, (2,1))*v, end='\n\n')
x = np.array([[1,2,3],[4,5,6]])
print(x, end='\n\n')
print(x+y, end='\n\n')
#print(x+w, end='\n\n') # 브로드캐스팅 불가능
print(x.T , end='\n\n')
print(x.T + w, end='\n\n')
print((x.T + w).T, end='\n\n')
# 출력 결과
[[ 4 5]
[ 8 10]
[12 15]]
[[ 4 8 12]
[ 5 10 15]]
[[1 2 3]
[4 5 6]]
[[2 2 4]
[5 5 7]]
[[1 4]
[2 5]
[3 6]]
[[ 5 9]
[ 6 10]
[ 7 11]]
[[ 5 6 7]
[ 9 10 11]]
1행 3열 배열을 3행 1열로 바꾸어 내적하여 계산하였습니다.
그 다음 라인에서는 w의 1행 2열 배열을 2행 1열로 내적하여 계산하였습니다.
행열의 구조를 변경하는 방법으로 .T 를 사용할 수도 있습니다.
x 행렬은 2행 3열짜리 배열로 구조를 잡아주었습니다.
x.T 를 사용하여 3행 2열짜리의 배열로 구조가 변경 된 것을 확인 하실 수 있습니다.