반응형

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열짜리의 배열로 구조가 변경 된 것을 확인 하실 수 있습니다.

 

반응형

+ Recent posts