Numpy 선행학습

박산해·2025년 6월 25일
import numpy as np

numpy 데이터형태 종류

numpy 제공 데이터 타입 이해하기

  • 파이썬 기본 제공 데이터타입 : int, float, string, bool - 단수 // list, tuple, dic, set - 복수
  • numpy : ndarray(다차원배열)
  • 기존 파이썬이 가질 수 있는 데이터 처리 크기보다 더 큰 데이터를 정리 할 수 있는 자료구조

numpy 배열의 특징

  • 동일한 자료형을 가지는 값들이 배열 형태로 존재
  • n차원 형태로 구성 가능
  • data에 접근하기 위한 index(색인) 존재

numpy 배열 다루기

  • 1차원 배열 생성
np.array([1, 2, 3, 4, 5])

출력값 : array([1,2,3,4,5])

list = [1, 2, 3, 4, 5]
arr1 = np.array(list)
arr1

출력값 : array([1,2,3,4,5])

리스트에 값을 넣어서 출력할수있음

list + 1 >> 오류
arr1 + 1 >> 가능

arr2 = np.array([[1, 2, 3, 4, 5],[5, 6, 7, 8, 9]])
arr2

출력값 : array([[1, 2, 3, 4, 5],
[5, 6, 7, 8, 9]])

줄바꿈 형태로 출력됨

2차원 배열의 정보 출력하기

print("배열의 크기(행,열) : ",arr2.shape)
print("배열의 요소 갯수 : ",arr2.size)
print("배열의 차원 수 : ",arr2.ndim)
print("배열의 데이터 타입 : ",arr2.dtype)

출력값 :
배열의 크기(행,열) : (2, 5)
배열의 요소 갯수 : 10
배열의 차원 수 : 2
배열의 데이터 타입 : int32

배열을 생성하는 다양한 함수들

1 ~ 50 들어있는 1차원 배열 생성

arr3 = np.arange(1, 51, 1)
arr3

출력값 :

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, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
       35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50])

arr3 > 2차원(5행10열) 변환

arr3.reshape(5,10)

출력값 :

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, 25, 26, 27, 28, 29, 30],
       [31, 32, 33, 34, 35, 36, 37, 38, 39, 40],
       [41, 42, 43, 44, 45, 46, 47, 48, 49, 50]])

실습) 이미지 데이터 불러와서 정보 확인하기

  • openCV 라이브러리 활용하기
!pip install opencv-python

import cv2
import matplotlib.pyplot as plt

1. 이미지 경로 불러오기

img = cv2.imread('./data/jang.jpg', cv2.IMREAD_COLOR)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)

img.ndim

행, 열, 채널(RGB)

img.shape

흰색의 경우 (255, 255, 255)r g b

img

출력값 :

array([[[235, 232, 241],
        [235, 232, 241],
        [235, 232, 241],
        ...,
        [236, 233, 240],
        [236, 233, 240],
        [236, 233, 240]],

       [[235, 232, 241],
        [235, 232, 241],
        [235, 232, 241],
        ...,
        [236, 233, 240],
        [236, 233, 240],
        [236, 233, 240]],

       [[235, 232, 241],
        [235, 232, 241],
        [235, 232, 241],
        ...,
        [236, 233, 240],
        [236, 233, 240],
        [236, 233, 240]],

       ...,
...
        [ 32,  28,  55],
        ...,
        [253, 242, 236],
        [253, 242, 236],
        [249, 240, 233]]], dtype=uint8)
회색톤 이미지로 변환
img = cv2.imread('./data/jang.jpg', cv2.IMREAD_COLOR)

기본적으로 컴퓨터 기본 3원색은 rgb  but, cv2의 경우 bgr
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

bgr > gray 변경
plt.imshow(img, cmap='gray')

gray 처리를 해 흑백 뿐이니 2차원

img.ndim

Numpy 데이터 접근

  • indexing ; slicing 이용하여 인덱스 기반 접근
  • boolean indexing : 논리연산자 이용 Ture 위치 데이터에 접근 가능

arr4 10, 20, 30 40, 50, 60 만들기

arr4 = np.arange(10, 61, 10)
arr4

arr4에 있는 40에 접근

arr4[3]

arr4에 있는 40, 60에 접근

arr4[3],arr4[5]
arr4[[3, 5]]       <- 파이썬에서는 여러 개를 동시에 입력 할 때 포장(packing)
arr4[3,5]         <- 이렇게 작성하면 컴마 앞은 행, 컴마 뒤는 열이라 인식 오류뜸

10 ~ 30 슬라이싱

arr4[:3]

출력값 : array([10, 20, 30])

10 30 50 출력 (slicing 이용)

arr4[0::2]      # [시작 인덱스 넘버 : 끝 인덱스 넘버 : 증가량]

출력값 array([10, 30, 50])

2행 3열

arr4 = arr4.reshape(2,3) 
arr4

출력값 :
array([[10, 20, 30],
[40, 50, 60]])

20에 접근

arr4[0,1]       # 이것만 기억

50, 60 출력

arr4[1,1:]

출력값 : array([50, 60])

1부터 50까지 들어있는 배열 (5행 10열)

arr5 = np.arange(1, 51, 1).reshape(5,10)
arr5

출력값 :

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, 25, 26, 27, 28, 29, 30],
       [31, 32, 33, 34, 35, 36, 37, 38, 39, 40],
       [41, 42, 43, 44, 45, 46, 47, 48, 49, 50]])

##실습

arr5[ : , [0, 3, 6, 9]]

출력값 :
array([[ 1,  4,  7, 10],
       [11, 14, 17, 20],
       [21, 24, 27, 30],
       [31, 34, 37, 40],
       [41, 44, 47, 50]])
arr5[ : , : : 3]

출력값 :
array([[ 1,  4,  7, 10],
       [11, 14, 17, 20],
       [21, 24, 27, 30],
       [31, 34, 37, 40],
       [41, 44, 47, 50]])
  • 조건에 맞는 데이터 접근하기(불리언 인덱싱)

참 거짓이 랜덤하게 10개의 데이터가 들어있는 배열

np.random.seed(1)       # 난수 생성기의 초기값(seed) 설정 > 재현성 확보
bool_arr = np.random.choice([True, False], size = 10)
temp_arr = np.arange(10)
bool_arr
출력값 :
array([False, False,  True,  True, False, False, False, False, False,
        True])
temp_arr[bool_arr]

출력값 :
array([2, 3, 9])

40 ~ 100 사이 랜덤 정수 10개

np.random.seed(18)       # 난수 생성기의 초기값(seed) 설정 > 재현성 확보
score_arr = np.random.randint(40, 100, size = 10)
# 번호 생성
num_arr = np.arange(1,11)
score_arr
출력값 :
array([82, 59, 96, 45, 89, 86, 90, 42, 48, 64])

75이상의 수 위치 넘버 확인

num_arr[score_arr >= 75]

출력값 :
array([1, 3, 5, 6, 7])

이미지의 얼굴에 접근 하기 > use

slicing
plt.imshow(img, cmap='gray')
plt.show()

이미지의 얼굴에 접근 하기 > use

slicing
plt.imshow(img[200:600, 180:600], cmap='gray')
plt.show()

이미지의 얼굴에 접근 하기 > use

slicing
plt.imshow(img[60:650, 100:640], cmap='gray')
plt.show()

0개의 댓글