Studio KimHippo :D
[Python / NumPy] 6. 브로드 캐스팅 본문
# -*- 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 제이크 밴더플래스 저/ 위키북스 김정인 역 - 파이썬 데이터 사이언스 핸드북
'Python Study > NumPy' 카테고리의 다른 글
[Python / NumPy] 8. NumPy의 구조화된 배열 (0) | 2019.07.08 |
---|---|
[Python / NumPy] 7.팬시 인덱싱, NumPy 정렬 (0) | 2019.07.08 |
[Python / NumPy] 5. NumPy ufunction (0) | 2019.07.08 |
[Python /NumPy] 4. 배열의 재구조화, 병합, 분할 (0) | 2019.07.07 |
[Python / NumPy] 3. NumPy 배열 인덱싱, 슬라이싱 (0) | 2019.07.07 |
Comments