뭉지(moonz)
작은 발자국들의 위대한 여정
뭉지(moonz)
  • All (202)
    • Test Code (4)
    • 백엔드 개발하며 작성한 (27)
      • Spring (17)
      • 데이터베이스 (7)
      • 기억할 내용 (3)
    • 언어 (53)
      • Java (25)
      • node.js (7)
      • Python (21)
    • 클라우드 (6)
    • Algorithm & Data Structure (51)
      • 개념 (15)
      • 문제 풀이 (36)
    • 유용한 모든 것 (16)
    • monologue (7)
      • 업무 노트 (1)
      • 관리 로그 (0)
      • 내 이야기 공책 (6)
    • Project (2)
    • TroubleShooting (8)
    • 지식 (18)
      • Machine Learning (6)
      • Review (7)
      • Web (5)
    • Computer Science (5)

블로그 메뉴

  • 홈
  • 태그

인기 글

최근 글

최근 댓글

전체 방문자
오늘
어제

티스토리

hELLO · Designed By 정상우.
뭉지(moonz)

작은 발자국들의 위대한 여정

클래스와 넘파이, 그리고 matplotlib
지식/Review

클래스와 넘파이, 그리고 matplotlib

2021. 1. 3. 18:25
반응형
『밑바닥부터 시작하는 딥러닝』도서를 공부하고 복습하는 내용입니다.
A = np.array([[1,2], [3,4]])
A.shape	# (2,2)
A.dtype	# dtype('int64')

1. 클래스

▶ int, str 등의 자료형은 파이썬이 기본으로 제공하는 내장된 자료형이다.

▶ 새로운 클래스를 정의할 수 있는데, 그때 그 클래스만의 전용 함수(메서드)와 속성을 정의할 수 있다.

▶ class 라는 키워드를 사용하여 클래스를 정의한다.

⑴ 클래스 정의

class 클래스 이름:
	def __init__(self, 인수 ...):		# 생성자
    	...
    def 메서드1(self, 인수 ...):		# 메서드1
    	...
    def 메서드2(self, 인수 ...):		# 메서드2
    	...

▶__init__

  클래스를 초기화하는 방법을 정의하는 특별한 메서드(생성자라고도 한다.)

  클래스의 인스턴스가 만들어질 때 한번만 불린다.

▶파이썬에서 메서드의 첫 번째 인수로 자신(의 인스턴스)을 나타내는 self를 명시적으로 쓰는 것이 특징이다.

▶예시)

class Man:
	def __init__(self, name):
    	self.name = name
        print("Initialized!")
    
    def hello(self):
    	print("Hello "+ self.name + "!")
        
    def goodbye(self):
    	print("Good-bye " + self.name + "!")
        
m = Man("Moon")		# m이라는 인스턴스(객체) 생성 -> 생성자 호출
m.hello()
m.goodbye()

▶인스턴스 변수 :  인스턴스 별로 저장되는 변수

▶파이썬에선 self.name처럼 self 다음에 속성 이름을 써서 인스턴스 변수를 작성하거나 접근할 수 있다.

 

2. 넘파이

▶딥러닝을 구현 시, 배열과 행렬 계산에 사용되는 외부 라이브러리이다.

 

a. 넘파이 라이브러리를 쓰기위해 

import numpy as np	# np를 통해 넘파이가 제공하는 메서드에 접근 가능하다.

b. 넘파이 배열 생성 np.array()  : 파이썬의 리스트[ ]를 인수로 받아 np의 배열로 변환시킨다.

>> x= np.array([1.0, 2.0, 3.0])
>> print(x)	# [1. 2. 3.] : 1.0을 1.으로 표현 가능.
>> type(x)	# <class 'numpy.ndarray'>

▶type() : 변수의 자료형을 알려주는 메서드

 

c. 넘파이 배열로 산술 연산하기.   ( x = np.array([1.0, 2.0, 3.0])    y = np.array([2.0, 4.0, 6.0])

>> x+y	# array([3., 6., 9.])
>> x-y	# array([-1., -2., -3.])
>> x*y	# array([2., 8., 18.])
>> x/y	# array([0.5, 0.5, 0.5])

* 주의) 배열끼리 산술 연살을 할 때, 원소의 수를 맞춰야 한다.

▶넘파이 배열과 수치 하나(스칼라값)의 조합으로도 산술연산 수행이 가능하다. 이를 "브로드캐스트"라고 한다.

    이는 배열의 원소 개수만큼 산술 연산이 수행된다. (예제에서는 총 3번 수행)

>> x/2.0	# array([0.5, 1., 1.5])

 

d. 넘파이의 N차원 배열

▶2차원 배열

2차원 배열(행렬)은 다음과 같이 생성된다.

1 2
3 4

▶ A.shape : 배열의 형상(각 차원의 크기(원소 수))

▶ A.dtype : 행렬에 담긴 원소의 자료형

▶산술 연산

>> A = np.array([[1,2], [3,4])
>> B = np.array([2.0, 4.0, 6.0])
>> A+B	# array([[4,2], [3,10]])
>> A*B	# array([[3,0], [0,24]])

# 브로드캐스트
>> A*10	# array([[10,20], [30,40]])

▶형상이 같은 행렬끼리면, 행렬의 산술 연산도 대응되는 원소별로 계산된다.

▶브로드캐스트 기능 : 행렬과 스칼라값의 산술 연산이 가능하다.

▶NOTE : 1차원배열 : 벡터, 2차원 배열 : 행렬, 벡터와 행렬을 일반화한 것 : 텐서 tensor , 3차원 이상의 배열을 다차원배열이라 하겠다.

 

e. 브로드 캐스트

▶형상이 다른 배열끼리의 계산 : [[1,2], [3,4]] * [10] = [[10,20], [30,40]]

>> A = np.array([[1,2], [3,4]])
>> B = np.array([10,20]]
>> A*B	# array([[10,40], [30,80]])

 

f. 원소 접근 (인덱스)

▶넘파이의 배열에는 인덱스로 접근할 수 있다.

>> X = np.array([[51,55], [14,19], [0,4]])
>> X[0]	# array([51,55])
>> X[0][1]	# 51

>> for row in X:
	print(row)
    
# [51,55]
# [14,19]
# [0,4]

 

▶인덱스를 배열로 지정해서 한번에 여러 원소에 접근할 수 있다.

>> X = np.array([[51,55], [14,19], [0,4]])
>> X = X.flatten()	# 행렬 X를 1차원 배열로 변환 (평탄화)
>> print(X)	# [51, 55, 14, 19, 0, 4]
>> X[np.array([0,2,4])	# 인덱스가 0,2,4인 원소에 접근 -> array([51, 14, 0])

▶X.flatten() : 행렬을 1차원배열로 변환(평탄화)하는 메서드

 

▶특정 조건을 만족하는 원소만 얻는 것도 가능하다.

>> X = np.array([[51,55], [14,19], [0,4]])
>> X>15	# array([True, True, False, True, False, False], dtype = bool)
>> X[X>15]	# array([51, 55, 19])

▶넘파이 배열에 부등호 연산을 수행하면 배열의 원소 각각에 수행한 bool 배열이 생성된다.

 

▶NOTE : 동적언어 python은 정적언어 C/C++보다 처리속도가 늦다. 그렇기 때문에 무거운 작업을 할 때에는 C/C++ 쓰는 것이 유리하다. 그래서 파이썬에서 빠른 성능을 요구할 경우 해당 부분을 C/C++로 구현한다. 그때 파이썬은 C/C++로 쓰인 프로그램을 호출하는 '중개자'역할을 한다.

-> 넘파이도 주된 처리는 C/C++로 구현한다.

 

 

3. matplotlib

▶딥러닝 실험에서 그래프 그리기와 데이터 시각화는 매우 중요한데, 이러한 그래프를 그려주는  외부 라이브러리이다.

 

a. matplotlib.pyplot 모듈로 그래프 그리기

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 6, 0.1)	# 0에서 6전까지 0.1 간격으로 배열 생성

# [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.  1.1 1.2 1.3 1.4 1.5 1.6 1.7
# 1.8 1.9 2.  2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.  3.1 3.2 3.3 3.4 3.5
# 3.6 3.7 3.8 3.9 4.  4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.  5.1 5.2 5.3
# 5.4 5.5 5.6 5.7 5.8 5.9]
y = np.sin(x)	# x,의 각 원소에 넘파이의 sin함수를 적용.

plt.plot(x,y)	# x, y를 인수로 그래프 그리기
plt.show()	# 그래프를 화면에 출력

▶np.arange(a, b, c) : a에서 b전까지 c간격으로 배열 생성.

▶np.sin() : 배열의 각 원소에 넘파이의 sin함수 적용하는 메서드.

▶.plot(x,y) : x,y를 인수로 그래프를 나타내는 메서드.

▶.show() : 그래프를 화면에 출력하는 메서드.

 

 

 

 

 

b. pyplot의 기능 (옵션들)

▶cos 함수도 추가할 수 있다.

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 6, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)

# 그래프 그리기
plt.plot(x, y1, label="sin")	# label 표시 이름 'sin'
plt.plot(x, y2, label = "cos", linestyle= "--")	# cos 함수는 점선으로 그리기
plt.xlabel("x")	# x축 이름
plt.ylabel("y")	# y축 이름
plt.title('sin&cos')	# 제목
plt.legend()	# 범례 표시
plt.show()

 

 

▶ label 속성 : 범례에 표시할 이름/ 라벨 이름

▶ .xlabel(), .ylabel() : x,y축 이름

▶ .title() : 제목

▶ .legend() : 범례 표시

 

 

 

 

 

c. 이미지 표시 메서드 imshow()

▶이미지를 읽어들일 때는 matplotlib.image 모듈의 imread() 메서드를 이용한다. from [모듈명] import [메서드명]

import matplotlib.pyplot as plt
from matplotlib.image import imread	# 형태 : from 라이브버리.모듈 import 메서드

img = imread('python.png')	# imread('') 내에는 사진의 경로를 기입해서 이미지를 읽어들인다.
plt.imshow(img)	# 이미지 표시
plt.show()

반응형
저작자표시 (새창열림)

'지식 > Review' 카테고리의 다른 글

퍼셉트론  (0) 2021.01.19
데이터 시각화 기초  (0) 2021.01.04
Parameter Learning (Gradient Descent)  (0) 2020.12.31
Const Function - Intuition 1,2  (0) 2020.12.28
Linear Regression(선형 회귀)  (0) 2020.12.27
    '지식/Review' 카테고리의 다른 글
    • 퍼셉트론
    • 데이터 시각화 기초
    • Parameter Learning (Gradient Descent)
    • Const Function - Intuition 1,2
    뭉지(moonz)
    뭉지(moonz)
    제가 깨달은 것을 정리하는 공간입니다. 🧡

    티스토리툴바