『밑바닥부터 시작하는 딥러닝』도서를 공부하고 복습하는 내용입니다.
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 |