본문 바로가기
Python 과 머신러닝/II. 데이터처리 문법

[Python 머신러닝] 4장. Numpy

by JoyfulS 2019. 10. 22.

< 공부한 내용 >

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

test1.jpg
0.02MB

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)

plt.imshow(r) 의 출력 결과

 

# 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 ----------------------------------------------------------

 

exam01.py
0.00MB
exam02.py
0.00MB

댓글