컴퓨터 비전

현준·2024년 7월 11일

사관학교

목록 보기
15/23

numpy

#numpy import
import numpy as np


# ModuleNotFoundError 가 발생할수 있다
# -> 모듈을 찾을 수 없다라는 에러 > 모듈을 설치해라 (라이브러리 설치)
# !pip install numpy > 넘파이 설치코드
# !pip install numpy==3.X.X 특정 버전 설치
# Numpy 설치시 체크하면 좋은 사항 
print(np.__version__)

numpy에서 제공하는 자료형태 이해해보기

  • 파이썬 기본 자료구조 : list, tuple, dictionary, set
  • Numpy 자료구조 : 배열(Array, ndarray, 다차원 배열)
  • 기존 파이썬이 가질수 있는 데이터 처리 크기보다 볼륨이 큰 데이터를 정리하고 핸들링 할 수 있는 자료 구조(형태)

Numpy 배열의 특징

  1. 다차원 배열, 행렬 데이터 구조 제공
  2. 동일한 자료형을 가지는 값들이 배열 형태로 존재한다
  3. n차원의 형태로 구성이 가능하다
  4. 데이터에 접근을 최적화 하기위해 색인(index)을 부여

numpy 데이터 타입(형태) 종류

배열의 속성 확인하기

  • 배열의 크기 : 배열.shape
  • 배열의 전체 데이터 갯수: 배열.size > shape 내부에 있는 보든 값의 곱
  • 배열의 차원 수 : 배열.ndim
  • 배열의 데이터 타입 : 배열.dtype
# 1차원 데이터 arr1 정보 출력해보기
print('arr 크기: ', arr1.shape)
print('arr 데이터 갯수: ', arr1.size)
print('arr 차원수: ', arr1.ndim)
print('arr 데이터 타입: ', arr1.dtype)

#
arr 크기:  (5,)
arr 데이터 갯수:  5
arr 차원수:  1
arr 데이터 타입:  int32



# 2차원 데이터 arr2 정보 출력해보기
print('arr 크기: ', arr2.shape)
print('arr 데이터 갯수: ', arr2.size)
print('arr 차원수: ', arr2.ndim)
print('arr 데이터 타입: ', arr2.dtype)


#
arr 크기:  (2, 5)
arr 데이터 갯수:  10
arr 차원수:  2
arr 데이터 타입:  int32

1차원 배열 생성

# 1~5까지 담은 리스트를 생성
list1 = [1,2,3,4,5]
# 넘파이 배열로 변환
arr1 = np.array(list1)
# 출력
arr1

# arr1, list1 비교
# list1 + 1 # 에러 발생
arr1 +1 # 배열과 단일 숫자의 연산이 적용된다 (모든 위치에 +1)
arr1

# 만약 리스트에 모든 숫자를 1씩 더해주고 싶다면
# 1. list1 + [1,1,1,1,1] # 리스트간 병합 진행

# 2. for문 이용해서
list2 = []
for i in list1:
    list2.append(i+1)
list2

2차원 배열 생성

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

# 심화 학습 >> numpy 브로드캐스팅
# array([[  1,   4,   9,  16,  25],
       [ 36,  49,  64,  81, 100]])
       

실습 1 1~50배열

# 1~50 까지 숫자 넣기
# 1번 방법
list3 = []
for i in range(1,51):
    list3.append(i)

arr3 = np.array(list3)
arr3


# 2번 방법
list_ = list(range(1,51))
arr4 = np.array(list_)
arr4



# 3번 방법
# np.arange() -> 원하는 만큼 숫자를 생성해서 배열을 만들어주는 함수
arr5 = np.arange(1,51)
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])

배열 차원 변경

# arr3/arr4/arr5 차원 >  1차원
# 차원의 변화를 줘서 2차원 배열의 형태를 바꿈
# arr3.reshape(행의 갯수, 열의 갯수)
# 주의점 > 내부 요소의 갯수가 비어잇거나 넘치지 않도록 변경을 해줘야 한다
# 전체 요소 갯수의 약수를 넣어주는 것이 에러 발생을 막는 하나의 팁

rs_arr3 = arr3.reshape(5,10)
rs_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]])

3차원 배열

앞에 대괄호 갯수 확인

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

matplotlib

from matplotlib import pyplot as plt
x = [1,2,3,4,5]
y = [6,7,8,9,10]

plt.plot(x,y, marker = 'o') # 직선 그래프 그려주는
plt.grid()  # 그래프에 격자무늬를 넣어줌
plt.show() # plt 그래프 보여주는 명령어

실습) 이미지 데이터를 불러와서 정보를 확인해보자

  • Opencv 라이브러리 활용
!pip install opencv-python

import cv2
from matplotlib import pyplot as plt
# matplotlib > 그래프/그림을 출력해주는 도구

# 1. 이미지 경로 지정하기
img_path = './data/po.jpg'

# 2. 이미지 읽어오기
img = cv2.imread(img_path, cv2.IMREAD_COLOR)
# cv2.imread(이미지의 경로/파일명.확장자, 이미지를 불러오는 방식): 이미지를 읽어 옮
# cv2.IMREAD_GRAYSCALE : 이미지를 흑백 이미지로 불러옮


# opencv 가 개발된 시점이 1998sus -> 이때 사용했던 색상 채널 순서 BGR
# matplotlib의 색상 채널 ->RGB
# opencv와 matplotlib 색상 채널을 맞춰주자
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 색상 채널을 변환해주는 함수


plt.xticks([]) # x축의 눈금값 제거
plt.yticks([]) # y축의 눈금값 제거
plt.imshow(img)

img.shape #(행(y축의 픽셀 갯수), 열(x축의 픽셀 갯수), 색상 채널 (R,G,B))

#
(300, 348, 3)

numpy 데이터 접근

# 10 ~ 60까지 10씩 증가하는 배열 만들기
arr = np.arange(10, 61, 10)

#
array([10, 20, 30, 40, 50, 60])
-----------------

arr[[3,5]] # 40, 60값 가져오기 대괄호 2개 사용
# arr[5,3] # 2차원 배열에서 5행 3열 데이터를 가져오기

슬라이싱 규칙

  1. 인덱스의 번호는 항상 0번부터 시작
  2. 인덱스 끝 번호는 미포함, 항상 +1 해줘야함

0개의 댓글