< 공부한 내용 >
1. Numpy 패키지의 기초 (random 모듈, array/arrange/zeros 함수)
2. indexing & slicing
3. reshape & transpose
"""
Numpy 패키지 특징
- 다차원 배열, 선형대수 연산(벡터, 행렬 연산), 고속 처리
-> 수학/통계 함수
-> 범위 수정, 블럭 연산
-> indexing/slicing
-> n차원 배열 자료구조 제공
"""
1. Numpy 패키지의 기초
import numpy as np
# list vs numpy
lst = [1,2,3]
lst * 0.5 # error - 계산 불가능
lst2 = [i*0.5 for i in lst]
lst2 # [0.5, 1.0, 1.5]
# list -> numpy의 array로
arr = np.array(lst)
arr # array([1, 2, 3])
arr * 0.5 # [0.5, 1. , 1.5] - 계산 가능
# 동일한 type
arr2 = np.array([1,2,3,'4']) # 문자 하나가 있으면 모두 문자로 인식됨
arr2
# ['1', '2', '3', '4'], dtype='<U11' (문자타입)
# 1. random 모듈 : 난수 생성 함수
data = np.random.randn(3, 4) # 3행 4열 -> 12개
# randn(행, 열) : 표준정규분포를 따르는 난수 생성
data
'''
** 랜덤으로 생성된 데이터이므로 만들 때마다 달라짐
array([[-0.21939476, 0.45358547, -0.56739396, 0.06361297],
[-1.3812372 , -2.506424 , -1.07394514, -0.60424777],
[-0.02045608, -0.74214898, -1.59615882, 0.21755705]])
'''
type(data) # numpy.ndarray
data.shape # (3, 4)
# 수학/통계 함수
data.sum() # 전체 합계
data.sum(axis = 0) # 열의 합계
data.sum(axis = 1) # 행의 합계
data.mean()
data.var()
data.std()
data.max()
data.min()
# 블럭 연산
data
data - data
'''
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
'''
data + data
'''
array([[-0.43878952, 0.90717094, -1.13478791, 0.12722595],
[-2.7624744 , -5.01284799, -2.14789028, -1.20849553],
[-0.04091216, -1.48429796, -3.19231765, 0.43511411]])
'''
# broadcast 연산
data * 0.5 # 2차원 * 0차원
'''
array([[-0.10969738, 0.22679273, -0.28369698, 0.03180649],
[-0.6906186 , -1.253212 , -0.53697257, -0.30212388],
[-0.01022804, -0.37107449, -0.79807941, 0.10877853]])
'''
# 2. array() 함수 : n차원 배열 생성
# 1) 단일 list -> 1차원 배열
lst1 = [3, 4.5, 6, 8]
arr1 = np.array(lst1)
arr1 # array([3. , 4.5, 6. , 8. ])
arr1.shape # (4,) : 1차원(4개 원소)
# 2) 중첩 list -> 2차원 배열 / 3차원 배열..
lst2 = [[1,2,3,4,5], [4,5,6,7,8]] # 1차원
arr2 = np.array(lst2)
arr2 # 2차원
'''
array([[1, 2, 3, 4, 5],
[4, 5, 6, 7, 8]])
'''
arr2.shape # (2, 5)
arr2.mean(axis = 1) # 행 단위 평균
# indexing/slicing
# obj[row, col]
arr2[:, 1:3] # 전체 행, 열2~3
arr2[1, :] # 2행 전체
arr2[:, 2] # 3열 전체
arr2[:, (0,4)] # 비연속 칼럼 선택
# 3. arange() 함수 : range()와 동일
'''
np.arange(n) # 0 ~ n-1 정수
np.arange(n, m) # n ~ m-1 정수
'''
num1 = np.arange(10)
num2 = np.arange(1, 10)
num1 # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
num2 # array([1, 2, 3, 4, 5, 6, 7, 8, 9])
num1.sum() # 45
num = list(range(10))
num # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# num.sum() - X
# range로 만든 데이터는 관련함수가 없어서 연산 불가능하므로 arange를 사용하는 것
# 4. zeros() 함수 : 전체 원소가 0으로 채워진 n자 배열
zarr = np.zeros(shape = (3,5)) # ones
zarr.shape # (3, 5)
zarr
'''
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
'''
cnt = 0
for i in np.arange(3) : # 0 ~ 2
for j in np.arange(5) : # 0 ~ 4
cnt += 1 # 카운터 변수
zarr[i, j] = cnt
zarr
'''
array([[ 1., 2., 3., 4., 5.],
[ 6., 7., 8., 9., 10.],
[11., 12., 13., 14., 15.]])
'''
2. indexing & slicing
"""
- indexing/slicing
- 3차원 indexing
- boolean indexing
"""
import numpy as np
# 1. indexing
'''
1차원 : obj [index]
2차원 : obj [행index, 열index] -> 하나만 입력시 행index로 인식 (default)
3차원 : obj [면index, 행index, 열index] -> 하나만 입력시 면index로 인식 (default)
'''
arr = np.arange(10) # 0 ~ 9
arr # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
arr[:3] # [0, 1, 2]
arr[:] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
arr[3:] # [3, 4, 5, 6, 7, 8, 9]
arr[-1] # 9
arr[::2] # start:stop:step # [0, 2, 4, 6, 8]
# 2. slicing
arr_sl = arr[5:8]
arr_sl # [5, 6, 7]
arr_sl[:] = 300 # 블럭 수정
arr_sl # 사본 수정 # [300, 300, 300]
arr # 원본도 수정됨 # [ 0, 1, 2, 3, 4, 300, 300, 300, 8, 9]
arr_sl2 = arr[:4].copy()
arr_sl2 # [0, 1, 2, 3]
arr_sl2[:] = 500
arr_sl2 # 사본 수정 # [500, 500, 500, 500]
arr # 원본 수정 안됨 # [ 0, 1, 2, 3, 4, 300, 300, 300, 8, 9]
# 3. 2차원/3차원 indexing
arr2d = np.array([[1,2,3], [4,5,6], [7,8,9]])
arr2d.shape # (3, 3) # 2차원
arr2d
'''
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
'''
arr2d[1:, 1:]
'''
array([[5, 6],
[8, 9]])
'''
arr2d[2, :] # 3행 전체
'''
[7, 8, 9]
'''
arr2d[:, 0] # 1열 전체
'''
[1, 4, 7]
'''
arr3d = np.array([ [[1,2,3], [1,2,3]], [[4,5,6], [4,5,6]], [[7,8,9],[7,8,9]] ]) # 3면 2행 3열
arr3d.shape # (3, 2, 3) # 3차원
arr3d
'''
array([[[1, 2, 3],
[1, 2, 3]],
[[4, 5, 6],
[4, 5, 6]],
[[7, 8, 9],
[7, 8, 9]]])
'''
arr3d[1] # 2면 전체
arr3d[1, 1] # 2면 2행
arr3d[1, 1, 1] # 2면 2행 2열
arr3d[2, :, 1] # 3면, 2열 전체
3. reshape & transpose
"""
1. image shape : 모양 보기
2. reshape
- 1차원 -> 2차원
- 2차원 -> 다른 모양 2차원
- 3차원 -> 3차원
3. 전치행렬
4. transpose : 축 번호를 이용해 구조 변경
"""
import numpy as np
from matplotlib.image import imread # 이미지 불러오기
import matplotlib.pyplot as plt
# 1. image shape
file_path = '../data/images/test1.jpg'
image = imread(file_path)
image # image 픽셀(0~255)
type(image) # numpy.ndarray
image.shape # (360, 540, 3) -> (세로, 가로, RGB색상)
# 이미지 보기
plt.imshow(image)
# 이미지 크롭
image_re = image[0:250, 120:, :]
plt.imshow(image_re)
# RGB 색상 분류
r = image[:,:,0]
g = image[:,:,1]
b = image[:,:,2]
plt.imshow(r)
plt.imshow(g)
plt.imshow(b)
r.shape # (360, 540)
# 2. reshape
arr1d = np.arange(1, 11) # 1차원
arr1d
# [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 1차원 -> 2차원
arr2d = arr1d.reshape(2, 5) # 1차원을 2행 5열 2차원으로 변경
arr2d
'''
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
'''
# 2차원 -> 다른 모양의 2차원
arr2d = arr2d.reshape(5, 2) # 2행 5열 -> 5행 2열
arr2d
'''
array([[ 1, 2],
[ 3, 4],
[ 5, 6],
[ 7, 8],
[ 9, 10]])
'''
# 2차원 -> 3차원
arr3d = arr2d.reshape(1, 2, 5) # 1면 2행 5열
arr3d
'''
array([[[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]]])
'''
# 3. 전치행렬
# 전치행렬이란? 모든 행을 대응하는 열로 위치를 바꾼 행렬
arr2d = np.array([[1,2,3], [4,5,6]])
arr2d
'''
array([[1, 2, 3],
[4, 5, 6]])
'''
arr2d.shape # (2, 3)
arr2d.T.shape # (3, 2)
# 4. transpose
'''
1차원 : 효과 없음
2차원 : 전치행렬
3차원 : 축 순서에 의해서 구조 변경
=> transpose : 3차원 데이터에서 구조 변경
'''
arr3d = np.arange(1,25).reshape(4, 2, 3) # 1부터 24까지 24개의 데이터를 4면 2행 3열로
arr3d
'''
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]],
[[13, 14, 15],
[16, 17, 18]],
[[19, 20, 21],
[22, 23, 24]]])
'''
arr3d.shape # (4, 2, 3)
# default : 역순 구조 변경(0, 1, 2) -> (2, 1, 0)
arr3d_re = arr3d.transpose() # transpose() # default
arr3d_re.shape # (3, 2, 4)
arr3d_re
'''
array([[[ 1, 7, 13, 19],
[ 4, 10, 16, 22]],
[[ 2, 8, 14, 20],
[ 5, 11, 17, 23]],
[[ 3, 9, 15, 21],
[ 6, 12, 18, 24]]])
'''
# image.shape
image.shape # (360, 540, 3) : (0, 1, 2)
plt.imshow(image)
# 가로 <-> 세로 : (0, 1, 2) -> (1, 0, 2)
image_re = image.transpose(1, 0, 2)
plt.imshow(image_re)
---------------------------------------------------------- example ----------------------------------------------------------
'Python 과 머신러닝 > II. 데이터처리 문법' 카테고리의 다른 글
[Python 머신러닝] 3장. 그룹화 (group by & apply) (0) | 2019.10.18 |
---|---|
[Python 머신러닝] 2장. 차트 시각화 - (3)시계열 데이터 (4) | 2019.10.18 |
[Python 머신러닝] 2장. 차트 시각화 - (2)pandas 객체 이용 (0) | 2019.10.17 |
[Python 머신러닝] 2장. 차트 시각화 - (1)matplot (0) | 2019.10.17 |
[Python 머신러닝] 1장. Pandas - (2) 기술통계, DataFrame 병합 (0) | 2019.10.16 |
댓글