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열짜리의 배열로 구조가 변경 된 것을 확인 하실 수 있습니다.
'python' 카테고리의 다른 글
[Python] (8) Numpy 배열 결합 (0) | 2020.06.15 |
---|---|
[Python] (7) Numpy 배열 행 열 추가 및 삭제 , 내장함수 (0) | 2020.06.15 |
[Python] Numpy (5) 집합, 전치 (0) | 2020.06.02 |
[Python] Numpy (4) - 배열 연산 , 벡터 내적 (0) | 2020.06.01 |
[Python] Numpy (3) - 슬라이싱 , 서브배열 (0) | 2020.06.01 |