본문 바로가기

FALL in/G.MA's 파이썬

[파이썬 Numpy] - 브로드 캐스팅


브로드 캐스팅(Broadcasting) 


- 브로드 캐스팅이 아닌 방법으로 행렬 연산하기1

>>> import numpy as np

>>> x = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])

>>> v = np.array([1,0,1])

>>> y = np.empty_like(x) # x의 모양(4,3)과 같은 행렬을 만들어준다.

>>> for i in range(4):

...     y[i,:] = x[i,:] + v

... 

>>> print y

[[ 2  2  4]

 [ 5  5  7]

 [ 8  8 10]

 [11 11 13]]



x행렬과 v행렬초기화했을때 구조이다. 


for문에서 y에 값을 넣는 방식이다.



- 브로드 캐스팅이 아닌 방법으로 행렬 연산하기2

>>> vv = np.tile(v,(4,1)) # v행렬을 4개의 행, 1개의 열로 만들어 vv에 넣어준다.

>>> print vv

[[1 0 1]

 [1 0 1]

 [1 0 1]

 [1 0 1]]

>>> y = x + vv # x와 vv는 같은 shape이므로 연산 가능하다.

>>> print y

[[ 2  2  4]

 [ 5  5  7]

 [ 8  8 10]

 [11 11 13]]

tile함수는 v행렬을 세로로 4개 가로로 1개 놓아주게한다.


- 브로드 캐스팅을 이용한 행렬 연산

>>> y = x + v # 단순히 연산만 해주면 자동으로 브로드 캐스팅된다.

>>> print y

[[ 2  2  4]

 [ 5  5  7]

 [ 8  8 10]

 [11 11 13]]

 

브로드캐스팅할때는 연산할 두 행렬의 차수에 유의해야한다.

예를 들어, 4 by 3 행렬과 1 by 3 행렬은 브로드 캐스팅이된다. 하지만 4 by 3  행렬과  1 by 2 행렬은 브로드 캐스팅이 불가능하다. 

각 차원에서 차수가 같거나 1이 어야한다.

3차원 행렬 4 X 3 X 2와 1 X 5 X 2는 브로드캐스팅이 되지않지만

4 X 3 X 2와 1 X 1 X 2는 가능하다.


>>> import numpy as np

>>> v = np.array([1,2,3])

>>> w = np.array([4,5])


>>> print np.reshape(v,(3,1)) * w 

[[ 4  5]

 [ 8 10]

 [12 15]]


>>> x = np.array([[1,2,3],[4,5,6]])


>>> print x+v

[[2 4 6]

 [5 7 9]]


>>> print (x.T + w).T

[[ 5  6  7]

 [ 9 10 11]]


>>> print x + np.reshape(w,(2,1))

[[ 5  6  7]

 [ 9 10 11]]


>>> print x * 2

[[ 2  4  6]

 [ 8 10 12]]

np.resape(v,(3,1)) 함수는 [1,2,3]를 

[ [1]

  [2]

  [3] ]

으로 만들어준다. 

'FALL in > G.MA's 파이썬' 카테고리의 다른 글

[파이썬 Numpy] - 배열 수학  (0) 2016.03.28
[파이썬 Numpy] - 데이터 타입  (0) 2016.03.28
[파이썬 Numpy] - 배열 인덱싱  (0) 2016.03.28
[파이썬 Numpy] - 배열  (1) 2016.03.28
[파이썬 클래스]  (0) 2016.03.26