Load Packages

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
%matplotlib inline

 

이미지 파일 열기

  • opencv로도 열 수 있지만 shape의 순서가 바뀔 때도 있어 PIL로 여는 것을 선호
path = 'images/dog.jpeg'

image_pil = Image.open(path)
image = np.array(image_pil)
image.shape # (334, 500, 3)

테스트용으로 images폴더 안에 dog.jpeg파일을 넣어두었다.

Pillow 라이브러리를 이용하여 해당 경로에있는 사진을 불러오고 시각화를위해 np.array화 시켜준다.

image.shape은 이미지마다 크기가 달르니 지금은 크게 신경쓰지않아도된다.

가장 뒤에있는 3이라는 숫자는 해당 이미지가 컬러이미지라는것을 뜻함 gray sacle의 이미지는 1로 나온다.

 

Matplotlib 사용

 

이미지 나타내기

 

이미지 흑백으로 변경

path = 'images/dog.jpeg'

image_pil = Image.open(path).conver('L')
image_bw = np.array(image_pil)
image_bw.shape # (334, 500)

아까는 shape의 가장뒤에 3이 있었지만 convert('L')을 통해 뒤에 shape의 3이 사라진다.

 

이미지 색상 변경 cmap이용

 

다른 이미지와 합치기

# 두번째 이미지를 불러옴
cat_path = 'images/cat.jpeg'
cat_pil = Image.open(cat_path)
cat_image = np.array(cat_pil)
cat_image.shape # (334, 500, 3)

# 만약 두 사진의 크기가 다르다면 같게 설정해준다.
import cv2
dog_image = cv2.resize(image, (500, 334)) #shape을 반대로 넣어야하니 주의
dog_image.shape # (334, 500)

설정이 끝나면 이미지를 불러올 수 있다. 

alpha(투명도)를 넣어주지않으면 cat_image가 dog_image를 덮어 cat_image만 나오게된다.

'Python > NumPy' 카테고리의 다른 글

NumPy - 시각화 기초(그래프)  (0) 2021.01.18
NumPy - Math Function  (0) 2021.01.13
NumPy - Broadcast  (0) 2021.01.13
NumPy - Indexing, Slicing  (0) 2021.01.13
NumPy - shape 및 차원 변경  (0) 2021.01.13

Load Packages

import numpy as np
import matplotlib.pyplot as plt

@matplotlib inline # jupyter notebook에서 실행한 결과물을 브라우저에서 바로 볼 수 있게해준다.

 

Matplotlib 사용

Basic Attributes

  • alpha : 투명도
  • kind : 그래프 종류 'line', 'bar', 'barh', 'kde'
  • logy : Y축에 대해 Log scaling
  • use_index : 객체의 색인을 눈금 이름으로 사용할지 여부
  • rot : 눈금 이름 돌리기 (rotating) 0 ~ 360
  • xticks, yticks : x, y축으로 사용할 값
  • xlim, ylim : X, Y축의 한계
  • grid : 축의 그리드를 표현할지 여부
  • subplots : 각 column에 독립된 subplot 그리기
  • sharex, sharey : subplots=True 이면 같은 X,Y축을 공유하고 눈금과 한계를 연결
  • figsize : 생성될 그래프의 크기를 tuple로 지정
  • title : 그래프의 제목 지정
  • legend : subplot의 범례 지정
  • sort_columns : column을 알파벳 순서로 그린다

선 그래프 그리기

그래프를 만들기위해 랜덤값을 가진 배열을 생성해주고 plt.plot()을 이용하여 만들어진 data를 대입시켜준다.

그렇게되면 x축은 data의 갯수 y축은 데이터의 값으로 이루어진 그래프가 나온다.

 

그래프 여러개 그리기

  • plt.subplot()의 파라미터는 행, 열, 순서를 넣어주면된다. ex) plt.subplot(2,2,1) 2행2열의 첫번째자리

 

그래프 선 옵션

  • 그래프를 그릴 때 표시되는 색이나 마커 패턴을 바꾼다.
  • - 색상:b(파란색), g(초록색), r(빨간색), c(청록색), y(노란색), k(검은색), w(흰색) - 마커: o(원), v(역삼각형), ^(삼각형), s(네모), +(플러스), .(점)

 

그래프 사이즈 조절

  • plt.figure안에 figsize를 이용하여 가로, 세로 길이 조절 가능(inch 단위)

  • 여러개 그래프 사이즈 조절

 

그래프 겹치기

 

그래프 Label, Legend 달기

  • Legend를 달기 위해서는 plot에 label을 넣어주어야 한다.
  • plt.title(): 그래프의 이름
  • plt.xlabel(): x축의 이름
  • plt.ylabel(): y축의 이름

 

'Python > NumPy' 카테고리의 다른 글

NumPy - 시각화기초(이미지)  (0) 2021.01.19
NumPy - Math Function  (0) 2021.01.13
NumPy - Broadcast  (0) 2021.01.13
NumPy - Indexing, Slicing  (0) 2021.01.13
NumPy - shape 및 차원 변경  (0) 2021.01.13

Math Function

NumPy에도 파이썬처럼 다양한 수학적 연산 기능이 있다.

 브로드캐스팅을 이용한 연산을 활용하여도 NumPy Math Function을 사용한 결과와 동일하게 나온다. 

import numpy as np

arr = np.arange(9).reshape(3, 3)
arr # array([[0,1,2], [3,4,5], [6,7,8]])

arr2 = np.ones([3,3])*2
arr2 # array([[2., 2., 2.], [2., 2., 2.], [2., 2., 2.]])

 

더하기 add()

arr + 10
np.add(arr, 10)
# array([[10,11,12],
#       [13,14,15],
#       [16,17,18]])

arr + arr2
np.add(arr, arr2)
# array([[ 2.,  3.,  4.],
#        [ 5.,  6.,  7.],
#        [ 8.,  9., 10.]])

 

빼기 substract()

arr - 5
np.subtract(arr, 5)
# array([[-5,-4,-3],
#       [-2, -1, 0],
#       [1, 2, 3]])

arr - arr2
np.subtract(arr, arr2)
# array([[-2., -1.,  0.],
#        [ 1.,  2.,  3.],
#        [ 4.,  5.,  6.]])

 

곱하기 multiply()

arr * 3
np.multiply(arr, 3)
# array([[0,3,6],
#       [9,12,15],
#       [18,21,24]])

arr * arr2
np.multiply(arr, arr2)
# array([[ 0.,  2.,  4.],
#        [ 6.,  8., 10.],
#        [12., 14., 16.]])

 

나누기 divide()

arr / 2
np.divide(arr, 2)
# array([[0., 0.5, 1.]
#       [1.5, 2., 2.5]
#       [3., 3.5, 4.]])

arr / arr2
np.divide(arr, arr2)
# array([[0. , 0.5, 1. ],
#        [1.5, 2. , 2.5],
#        [3. , 3.5, 4. ]])

 

 

배열의 합 sum()

np.sum(arr) # 36
np.sum(arr, arr2) # 54.0

 

배열 원소들 중 최대 값 max(), argmax()

np.max(arr) # 8
np.argmax(arr) # 8(여기서 8은 최대 값이 위치한 인덱스를 의미)

 

배열 원소들 중 최소 값 min(), argmin()

np.min(arr) # 0
np.argmax(arr) # 0(여기서 0은 최소 값이 위치한 인덱스를 의미)

 

배열의 평균 값 mean()

np.mean(arr) # 4

 

중복을 제외한 원소 unique()

arr = np.array([1,3,5,3,6,5,1,7,8])
np.unique(arr) # array([1,3,5,6,7,8)]

 

이외에도 수 많은 연산함수가 있고 궁금한 연산함수가 있다면 numpy.org/doc/stable/reference/routines.math.html를 참고

'Python > NumPy' 카테고리의 다른 글

NumPy - 시각화기초(이미지)  (0) 2021.01.19
NumPy - 시각화 기초(그래프)  (0) 2021.01.18
NumPy - Broadcast  (0) 2021.01.13
NumPy - Indexing, Slicing  (0) 2021.01.13
NumPy - shape 및 차원 변경  (0) 2021.01.13

Broadcast

연산 모양이 다른 배열들 간의 연산이 특정 조건을 만족했을 때 연산이 가능하도록 배열을 자동적으로 변환한다.

  - 차원의 크기가 1일 때 가능하다.

  - 값이 하나인 배열은 어떤 배열에나 연산이 가능하다.

  - 차원의 짝이 맞을 때 가능하다.

http://www.astroml.org/book_figures/appendix/fig_broadcast_visual.html

투명하게 보이는 박스들은 브로드캐스트된 값을 나타낸다. 

 

Broadcast 예제

import numpy as np

arr = np.arange(9).reshape(3,3)
arr # array([[0,1,2], [3,4,5], [6,7,8]])

# 더하기 연산
arr + 3 # array([[3,4,5], [6,7,8], [9,10,11]])

# 빼기 연산
arr - 2 # array([[-2,-1,0], [1,2,3], [4,5,6]])

# 곱하기 연산
arr * 3 # array([[0,3,6], [9,12,15], [18,21,24]])

# 나누기 연산
arr / 2 # array([[0., 0.5, 1.], [1.5, 2., 2.5], [3., 3.5, 4.]])

# 배열끼리 연산
arr + np.array([1,2,3]) # array([[1,3,5], [4,6,8], [7,9,11]])

 

'Python > NumPy' 카테고리의 다른 글

NumPy - 시각화 기초(그래프)  (0) 2021.01.18
NumPy - Math Function  (0) 2021.01.13
NumPy - Indexing, Slicing  (0) 2021.01.13
NumPy - shape 및 차원 변경  (0) 2021.01.13
NumPy - 배열 생성 및 데이터타입  (0) 2021.01.13

Indexing

기존 파이썬의 배열인덱싱과 비슷하다.

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

 

Slicing

 기존 파이썬의 배열슬라이싱과 비슷하다.

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

 

Boolean Indexing

arr = np.array([[-1.,-2.,1.], [1.1, 0.1, 0.2], [0., 0.2, -0.1]])

arr < = 0  # 0보다 작다면 True, 크다면 False
# array([[ True,  True, False],
#       [False, False, False],
#       [ True, False,  True]])

arr[arr <= 0] = 1
# array([[1. , 1. , 1. ],
#       [1.1, 0.1, 0.2],
#       [1. , 0.2, 1. ]])

'Python > NumPy' 카테고리의 다른 글

NumPy - Math Function  (0) 2021.01.13
NumPy - Broadcast  (0) 2021.01.13
NumPy - shape 및 차원 변경  (0) 2021.01.13
NumPy - 배열 생성 및 데이터타입  (0) 2021.01.13
Tensor 이해하기  (0) 2021.01.09

Reshape

 shape의 크기를 바꿔준다.

arr = np.array([1,2,3], [1,2,3])
arr.shape # (2, 3)
arr = arr.reshape([1,6])
arr.shape # (1, 6)

Reshape, -1 활용

arr = np.array([[1,2,3], [1,2,3]])
arr.shape # (2, 3)
arr = arr.reshape(-1)
arr.shape # (6, )

 

Ravel

 배열의 차원을 1차원으로 바꿔준다. 

 arr.reshape(-1)과 같다.

arr = np.array([[1,2,3], [1,2,3], [1,2,3]])
arr = arr.ravel()
arr.shape # (9, )

 

Expand_dims()

 안의 값은 유지하되 차원 수를 늘릴 때 사용한다.

arr = np.array([[1,2,3], [1,2,3], [1,2,3]])
arr.shape # (3, 3)
arr = np.expand_dims(arr, -1)
arr.shape # (3, 3, 1)
arr = np.expand_dims(np.expand_dims(arr, -1), 0)
arr.shape # (1, 3, 3, 1, 1)

 

'Python > NumPy' 카테고리의 다른 글

NumPy - Math Function  (0) 2021.01.13
NumPy - Broadcast  (0) 2021.01.13
NumPy - Indexing, Slicing  (0) 2021.01.13
NumPy - 배열 생성 및 데이터타입  (0) 2021.01.13
Tensor 이해하기  (0) 2021.01.09

NumPy

행렬이나 일반적으로 대규모 다차원 배열을 쉽게 처리할 수 있도록 지원하는 파이썬의 라이브러리이다.

데이터 구조 외에도 수치 계산을 위해 효율적으로 구현된 기능을 제공한다.

 

NumPy 예제

배열 생성

array

import numpy as np

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

 

Random array 생성 random.randn

arr = np.random.randn(3, 3)
arr
# array([[ 1.60158672,  1.17769594, -0.79191802],
#       [ 0.54598717,  0.15090111, -1.33924214],
#       [ 0.10766564, -0.86054647,  1.1948043 ]])

zeros

0으로 채워진 numpy array를 만든다.

zeros = np.zeros([2, 3])
zeros # array([[0., 0., 0.], [0., 0., 0.]])

ones

1로 채워진 numpy array를 만든다.

ones = np.ones([2, 3])
zeros # array([[1., 1., 1.], [1., 1., 1.]])
ones * 5 # array([[5., 5., 5.], [5., 5., 5.]])

 

Data Type

dtype

배열 타입 확인

arr = np.array([1,2,3])
arr.dtype # dtype('int64')

astype()

배열 타입 변경

arr = np.array([1,2,3])
arr.astype(np.int32)
arr.dtype # dtype('int32')

배열을 선언할 때 타입도 선언해줄 수 있다.

arr = np.array([1,2,3], dtype=np.uint8)
arr.dtype # dtype('uint8')

shape

차원의 갯수 확인

arr = np.array([[1,2,3], [1,2,3]])
arr.shape # (2, 3) value값이 3개인 배열이 2개가 있다는 뜻

ndim

배열의 차원 확인

arr = np.array([[1,2,3], [1,2,3], [4,5,6]])
arr.shape # (3, 3)
arr.ndim # 3

size

배열 크기 확인 

arr = np.array([[1,2,3], [1,2,3], [4,5,6]])
arr.shape # (3, 3)
arr.size # 9

 

'Python > NumPy' 카테고리의 다른 글

NumPy - Math Function  (0) 2021.01.13
NumPy - Broadcast  (0) 2021.01.13
NumPy - Indexing, Slicing  (0) 2021.01.13
NumPy - shape 및 차원 변경  (0) 2021.01.13
Tensor 이해하기  (0) 2021.01.09

Tensor

사전적의미로는 벡터의 확장 개념. 수학/물리학에서 중요한 역할을 하는 텐서는 백터의 개념을 포함한다.

딥러닝에서 주로 과원적인 데이터를 많이 사용하게되어 Tensor라는 개념이 많이 나오게되어 개념을 이해하는 것이 중요하다.

Numpy는 그런 고차원적인 데이터를 다루기 쉽게 만들어져있어 딥러닝을 하게 된다면 늘 접하게 될 것이다.

 

0차원

numpy array는 1 또는 5, 10 과 같이 숫자 데이터를 array화 시켜줄 수 있다.

Scalar로 들어갔을 때는 shape가 아무것도 없는 것으로 나온다.

   *Scalar: 실수 전체 집합에 속하는 특정 값*

import numpy as np
arr = np.array(5) #numpy에서 배열을 생성하는방법
arr.shape #Scalar로 들어갔을 때는 shape이 나오지않는다.
arr.ndim #배열의 차원을 리턴해줌 여기서는 0을 리턴

 

1차원

숫자가 10과 같이 하나만 들어간다고 해도 [] 리스트를 한번 씌우게 되면 차원이 생긴다.

이때 1차원이 되는건데 numpy에서 shape을 표현할 때 (1)이 아닌 (1,)과 같은 방식으로 표현한다.

(3,)에서 3은 값이 아닌 shape을 나타내는 것을 명심해야한다.

arr = np.array([3])
arr.shape #(1,)
arr = np.array([1,2,3])
arr.shape #(3,) 1차원배열에 3개의 값이 들어갔다는 의미이다.

 

2차원

대괄호를 추가적으로 씌우면 차원이 추가로 하나생긴다.

arr = np.array([[1,2,3]])
arr.shape #(1, 3)
arr = np.array([[1,2,3], [1,2,3], [1,2,3]])
arr.shape #(3, 3)

*참고: 0차원 숫자에 대괄호를 2번씌우면 2차원이 된다.

 

다차원

arr = np.array([[[1], [2], [3]], [[1], [2], [3]], [[1], [2], [3]]])
arr.shape #(3, 3, 1)

 

'Python > NumPy' 카테고리의 다른 글

NumPy - Math Function  (0) 2021.01.13
NumPy - Broadcast  (0) 2021.01.13
NumPy - Indexing, Slicing  (0) 2021.01.13
NumPy - shape 및 차원 변경  (0) 2021.01.13
NumPy - 배열 생성 및 데이터타입  (0) 2021.01.13

+ Recent posts