Studio KimHippo :D

[Python / NumPy] 6. 브로드 캐스팅 본문

Python Study/NumPy

[Python / NumPy] 6. 브로드 캐스팅

김작은하마 2019. 7. 8. 16:01
# -*- coding : utf-8 -*-
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

# NOTE
# 벡터화하는 연산을 위해서는 NumPy의 ufuncs말고 브로드캐스팅 기능이 있다.
# 브로드캐스팅은 다른 크기의 배열에 이항 ufuncs를 적용하기 위한 규칙이다.

a = np.array([0, 1, 2])
b = np.array([5, 5, 5])
print(a + b)
print(a + 5)

M = np.ones((3,3))
M + a

Out [1] :

[5 6 7]
[5 6 7]

 

Out [2] : 

array([[1., 2., 3.],

       [1., 2., 3.],

       [1., 2., 3.]])

a2 = np.arange(3)
b2 = np.arange(3)[:, np.newaxis]
print(a2, b2)
a2 + b2 

# NOTE
# 브로드캐스팅 규칙
# 1. 두 배열의 차원 수가 다르면 더 작은 수의 차원을 가진 배열 형상의 앞쪽(왼쪽)을 1로 채운다.
# 2. 두 배열의 형상이 어떤 차원에서도 일치하지 않는다면 해당 차원의 형상이 1인 배열이 다른 형상과 일치하도록 늘어난다.
# 3. 임의의 차원에서 크기가 일치하지 않고 1도 아니라면 오류가 발생한다.

Out [1] :

[0 1 2]

 [[0] [1] [2]]

 

Out [2] :

array([[0, 1, 2],

       [1, 2, 3],

       [2, 3, 4]])

# Ex.
M = np.ones((2, 3))
a = np.arange(3)

# step.1
# M.shape = (2, 3)
# a.shape = (3, )

# step.2
# M.shape = (2, 3)
# a.shape = (1, 3)

# step.3
# M.shape = (2, 3)
# a.shape = (2, 3)

M + a

# Ex.2
a = np.arange(3).reshape((3,1))
b = np.arange(3)

# step.1
# a.shape = (3, 1) 
# b.shape = (3, )

# step.2
# a.shape = (3, 1)
# b.shape = (1, 3)

# step.3
# a.shape = (3, 3)
# b.shape = (3, 3)

a + b 

Out [1] :

array([[1., 2., 3.],

       [1., 2., 3.]])

 

Out [2] :

array([[0, 1, 2],

       [1, 2, 3],

       [2, 3, 4]])

 

Out [3] :

array([[4., 2.],

       [4., 2.],

       [4., 2.]])

# Ex.3
M = np.ones((3, 2))
a = np.arange(3)

# step.1
# M.shape = (3, 2)
# a.shape = (3, )

# step.2
# M.shape = (3, 2)
# a.shape = (1, 3)

# step.3
# M.shape = (3, 2)
# a.shape = (3, 3)

a = a[:, np.newaxis].shape

M + a 
# 실전 브로드캐스팅
X = np.random.random((10, 3))
Xmean = X.mean(0) # NOTE : 첫 번째 차원의 특성별 평균 구함.
Xmean

X_centered = X - Xmean # NOTE : X 배열을 중앙 정렬함.
X_centered.mean(0)

# NOTE : x, y는 0에서 5까지 50 댠계로 나눈 배열
x = np.linspace(0, 5, 50)
y = np.linspace(0, 5, 50)[:, np.newaxis]
z = np.sin(x) ** 10 + np.cos(10 + y * x)*np.cos(x)

Out [1] :

array([0.57282034, 0.53378169, 0.47890112])

 

Out [2] :

array([-4.4408921e-17,  0.0000000e+00,  0.0000000e+00])

plt.imshow(z, origin = 'lower', extent = [0, 5, 0, 5], cmap = 'viridis')
plt.colorbar() 

Out [1]:

참고

O'REILLY 제이크 밴더플래스 저/ 위키북스 김정인 역 - 파이썬 데이터 사이언스 핸드북

Comments