Python
1-1강. Basic computer class for newbies
컴퓨터 OS(Operating System)란, 운영체제로, 프로그램이 동작할 수 있는 구동 환경을 말한다. 프로그램은 OS에 의존적이기 때문에 OS에 맞춰서 개발을 해야한다.
파일 시스템(File system)이란, OS에서 파일을 저장하는 트리구조 저장 체계이다. 파일의 기본 체계는 디렉토리(폴더) 와 파일로 구성되어 있다.
터미널에서는 mouse가 아닌 키보드로 명령을 입력하여 프로그램을 실행한다. 각 터미널에는 프로그램을 작동하는 shell이 존재하며, shell마다 다른 명령어를 사용한다. shell에서 사용하는 명령어는 다음과 같다.
- CD : 현재 디렉터리 이름을 보여주거나 바꾼다.
- clear : CMD 화면에 표시된 것을 모두 지운다.
- cp : 하나 이상의 파일을 다른 위치로 복사한다.
- rm : 하나 이상의 파일을 지운다.
- ls : 디렉터리에 있는 파일과 하위 디렉터리 목록을 보여준다.
1-2강. 파이썬 개요
Python은 1991년 귀도 반 로섬이 발표한 언어이다. 'Monty Python's Flying Circus'가 파이썬 이름의 유래이다.
Python의 특징은 다음과 같다.
- 플랫폼(OS) 독립적
- 인터프리터 언어 : 컴파일러 언어와는 달리 간단히 작성 가능하며 메모리가 적게 필요하지만, 실행속도가 느리다.
- 객체 지향 : 실행 순서가 아닌 단위 모듈(객체) 중심으로 프로그램을 작성하였다.
- 동적 타이핑 언어 : 프로그램이 실행하는 시점에 사용해야할 데이터에 대한 타입을 프로그램이 결정한다.
python을 사용하는 이유는 쉽고 간단하며 다양하기 때문이다. 직관적으로 이해하기 쉬운 문법을 가지고 있어 사람이 이해하기 용이하다. 또한, 다양한 라이브러리를 갖고 있다. 특히 통계나 데이터 분석에 용이하다.
2-1강. Variables
variable & memory
변수란, 데이터(값)을 저장하기 위한 메모리 공간의 프로그래밍상 이름이다. ( ex. a = 5 에서 a가 변수이다. )
변수는 프로그램에서 사용하기 위한 특정한 값을 저장하는 공간이다. 변수가 선언되는 순간 메모리 특정영역에 물리적인 공간이 할당된다. 변수에는 값이 할당되고, 해당 값은 메모리에 저장되는 것이다.
따라서, a = 5의 의미는 'a라는 이름을 가진 메모리 주소에 5를 저장해라' 이다.
변수 이름 작성 방법은 다음과 같다.
- 알파벳, 숫자, 언더스코어(_)로 선언 가능
- 의미 있는 단어로 변수명을 설정할 것
- 대소문자를 구분하여 사용 가능
- 특별한 의미가 있는 예약어를 쓰지 않아야 한다.( ex. if, for, else 등)
basic operations (간단한 연산)
data type은 파이썬이 처리할 수 있는 데이터 유형이다.
- 정수형(수치자료형) : int (양/음의 정수를 나타냄)
- 실수형(수치자료형) : float(소수점이 포함된 실수를 나타냄)
- 문자형 : string(따옴표 안에 들어가 있는 문자형을 나타냄)
- 논리/불린 자료형 : boolean(참 또는 거짓을 나타냄)
+, -, *, / 와 같은 기호들을 연산자라고 한다. 이러한 연산자에 의해 계산이 되는 숫자들을 피연산자라고 한다.
수식에서 연산자의 역할은 수학에서와 동일하며, 문자에서는 문자끼리의 + 연산만 가능하다.
다음과 같은 연산이 있다.
- ** : 제곱승 ( ex. 3 ** 5 는 3의 5승을 말한다.)
- % : 나머지를 구하는 연산자
- // : 몫을 구하는 연산자
- += : 증가 연산 ( ex. a += 1 은 a에 1을 더한 후, 그 값을 다시 a에 할당하는 것이다.)
- float(), int() : 데이터의 형 변환 가능. ( ex. int(3.7)을 하면, 3이 출력된다. float(10)을 하면 10.0이 출력된다.)
- type() : 변수의 데이터 형을 확인하는 함수
문자는 문자끼리 연산이 가능하고, 숫자는 숫자끼리 연산이 가능하다.
list
리스트는 시퀀스 자료형으로, 여러 데이터들의 집합이다. int와 float와 같은 다양한 데이터 타입을 포함한다.
리스트의 특징은 다음과 같다.
- 인덱싱(indexing) : 리스트에 있는 값들은 주소를 가지므로 이를 통해 할당된 값을 호출한다.
- 슬라이싱(slicing) : 리스트의 값을 잘라서 쓸 수 있다. 주소 값을 기반으로 슬라이싱 한다.
- 리스트 연산 : +, *, + 등의 연산이 가능하다.
- 추가/삭제 : append, extend, insert, remove, del 등을 활용 가능하다.
- 메모리 저장 방식 : 리스트 끼리의 = 연산은 메모리 주소에 해당 값을 연결한다는 의미이다.
- 패킹과 언패킹
- 이차원 리스트 : 리스트 안에 리스트를 만들어 행렬을 생성 할 수 있다.
1차원 리스트 복사는 list_name[:]으로 가능하지만, 2차원 리스트 복사는 copy.deepcopy를 해주어야 한다.
2-2강. Function & Console IO
함수
- 어떤 일을 수행하는 코드의 덩어리
- 반복적인 수행을 1회만 작성 후 호출하는데 용이함
- 코드를 논리적인 단위로 분리 가능
- 캡슐화 : 인터페이스만 알면 타인의 코드 사용 가능
def calculate_rectangle_area(x, y):
return x * y
함수 선언 문법
def 함수 이름(parameter #1, ..., ):
수행문 #1(statements)
수행문 #2(statements)
return 반환값
- 들여쓰기를 할 때는 4 space를 원칙으로 한다.
- parameter : 함수의 입력 값 인터페이스
- argument : 실제 parameter에 대입된 값
함수 형태
- 함수는 parameter의 유무, 반환 값 유무에 따라 형태가 달라진다.
parameter 없음 | parameter 있음 | |
return 값 없음 | 함수 내의 수행문만 수행 | parameter를 사용, 수행문만 수행 |
return 값 있음 | parameter 없이 수행문 수행 후 결과 값을 반환 | parameter를 사용하여 수행문 수행 후 결과 값 반환 |
입출력
- input() : 콘솔창에서 문자열을 입력 받는 함수
- print() : 콤마(,)를 사용할 경우, print 문이 연결된다.
print formatting
- %-format
- "%datatype" % (variable) 형태로 출력 양식을 표현
print('%s %s' % ('one', 'two'))
- str.format() 함수
- "~~~{datatype}~~~~".format(argument) 형태로 표현
print("My name is {0} and {1} years old.".format(name, age))
# 여유공간을 지정하여 글자배열 + 소수점 자릿수 맞추기
print("Product : {0:>10s}, Price per unit: {1:10.3f}.".format("Apple", 5.243))
## > 은 오른쪽 정렬, < 은 왼쪽 정렬
- f-string
- python 3.6 이후, PEP498에 근거한 formatting 기법
name = "inni"
age = "25"
print(f"Hello, {name}. You are {age}.")
2-3강. Conditionals & Loops
조건문
- 조건에 따라 특정한 동작을 하게하는 명령어
- 조건을 나타내는 기준과 실행해야 할 명령으로 구성됨
- 조건의 참, 거짓에 따라 실행해야 할 명령이 수행되거나 되지 않음
- if, else, elif 등의 예약어를 사용함
if ~ else문 문법
if 조건: # if를 쓰고 조건 삽입 후 ":" 입력
수행 명령 1-1 # 들여쓰기(identation) 후 수행명령 입력
수행 명령 1-2 # 같은 조건하에 실행일 경우 들여쓰기 유지
else: # 조건이 불일치할 경우 수행할 명령 block
수행 명령 2-1 # 조건 불일치 시 수행할 명령 입력
수행 명령 2-2 # 조건 불일치 시 수행할 명령 들여쓰기 유지
- 가장 기본적인 조건문으로, 조건에 따른 명령을 실행한다.모든 if 문은 순차적으로 실행된다.
- if 문에 해당하는 조건 이외에도 다른 조건을 추가하고 싶을 때, elif를 사용하여 조건을 더 추가해 주면 된다.
비교 연산자
비교 연산자 | 비교 상태 | 설명 |
x < y | ~보다 작음 | x가 y보다 작은지 검사 |
x > y | ~보다 큼 | x가 y보다 큰지 검사 |
x == y | 같음 | x와 y가 값이 같은지 검사 |
x is y | 같음 | x와 y가 메모리 주소가 같은지 검사 (python에서 -5 ~ 256은 같은 메모리 주소를 사용하기 때문에 이 범위에서는 맞다고 나옴) |
x != y | 같지 않음 | x와 y가 값이 다른지 검사 |
x is not y | 같지 않음 | x와 y가 메모리 주소가 다른지 검사 |
x >= y | 크거나 같음 | x가 y보다 이상인지 검사 |
x <= y | 작거나 같음 | x가 y보다 이하인지 검사 |
조건 참/거짓의 구분
- 숫자형의 경우, 수학에서의 참/거짓과 동일함
- 컴퓨터는 존재하면 참, 존재하지 않으면 거짓이라고 판단함
예를 들어, 1은 참이고 0은 거짓이다. if "abc":는 참이고, if " ":는 거짓이다.
논리 키워드 (and, not, or)
a = 8
b = 5
if a == 8 and b == 4 -> 거짓
if a > 7 or b > 7 -> 참
if not ( a > 7 ) -> 거짓
삼항 연산자
- 조건문을 사용하여 참일 경우와 거짓일 경우의 결과를 한줄에 표현
a = 12
is_even = True if value % 2 == 0 else False
print(is_even)
## True
반복문
- 정해진 동작을 반복적으로 수행하게 하는 명령문
- 반복문은 반복 시작 조건, 종료 조건, 수행 명령으로 구성됨
- for, while 등의 명령 키워드를 사용한다.
for문
for loop in [1, 2, 3, 4, 5]:
print('hello')
for loop in range(0, 5):
print('hello')
- range(0, 5)는 [0, 1, 2, 3, 4]와 같은 의미이다.
for i in range(1, 10, 2):
print(i)
- 1부터 10까지 2씩 증가시키면서 반복문 수행
[반복문 상식!!]
- 반복문 변수명
- 임시적인 반복 변수는 대부분 i, j, k로 정한다.
- 이는 수학에서의 x, y, z와 비슷하다.
- 0부터 시작하는 반복문
- 반복문은 대부분 0부터 반복 시작한다.
- 이는 2진수가 0부터 시작하기 때문에 0부터 시작하는 것을 권장한다고 한다.
- 무한 loop
- 반복 명령이 끝나지 않는 프로그램 오류
- CPU와 메모리 등 컴퓨터의 리소스를 과다하게 점유함
while문
i = 1
while i < 10:
print(i)
i += 1
- for문은 while문으로 변환 가능하다.
- for문 : 반복 실행횟수를 명확히 알 때 사용
- while문 : 반복 실행횟수가 명확하지 않을 때 사용
- break : 특정 조건에서 반복 종료
- countinue : 특정 조건에서 남은 반복 명령 skip
for i in range(10):
if i == 5:
break
print(i)
for i in range(10):
if i == 5:
continue
print(i)
반복의 제어
- 반복 조건이 만족하지 않을 경우, 반복 종료 시 1회 수행
for i in range(10):
print(i)
else:
print("EOP")
i = 0
while i < 10:
print(i)
i += 1
else:
print("EOP")
- break로 종료된 반복문은 else block이 수행되지 않는다.
4-1강. Python Object Oriented Programming
객체지향 프로그래밍(Object-Oriented Programming, OOP)에서 객체는 속성과 행동을 가진다. OOP는 이러한 객체 개념을 프로그램으로 표현한다. 속성은 변수(variable), 행동은 함수(method)로 표현된다.
Python naming rule
- snake_case : 띄어쓰기 부분에 "_"를 추가하여 뱀처럼 늘여쓴다. 파이썬 함수/변수명에 사용
- CamelCase : 띄어쓰기 부분에 대문자로 표기한다. 파이썬 Class명에 사용
Attribute 추가하기
- attribute 추가는 __init__, self와 함께 쓴다. __init__은 객체 초기화 예약 함수이다.
class SoccerPlayer(object):
def __init__(self, name, position, back_number):
self.name = name
self.position = position
self.back_number = back_number
python에서 __ 의미
- __는 특수한 예약 함수나 변수, 그리고 함수명 변경(맨글링)으로 사용된다. (ex. __main__, __add__ 등)
method 구현하기
- method(action) 추가는 기존 함수와 같지만, 반드시 self를 추가해야만 class 함수로 인정된다.
self는 생성된 instance를 의미한다.
6강. numpy
행렬과 매트릭스를 코드로 표현하기 가장 쉬운 방법은 list 형태로 표현하는 것이다.
하지만, list의 한계로 인해 굉장히 큰 matrix는 표현하기 어려우며 처리 속도에 문제가 있다. 이를 해결하기 위해서 python에서는 파이썬 과학 처리 패키지라고 불리는 numpy(Numerical Python)를 사용한다.
numpy는 고성능 과학 계산용 패키지로, matrix와 vector와 같은 array 연산의 사실상의 표준이다.
numpy의 특징은 다음과 같다.
- 일반 list에 비해 빠르고, 메모리 효율적
- 반복문 없이 데이터 배열에 대한 처리를 지원함 (while, for문을 사용하지 않음)
- 선형대수와 관련된 다양한 기능을 제공함
- C, C++, 포트란 등의 언어와 통합 가능
ndarray
numpy의 호출 방법은 아래와 같다. 일반적으로 numpy는 np라는 별칭으로 사용된다.
import numpy as np
numpy는 np.array 함수를 활용하여 배열을 생성한다. 생성된 배열을 'ndarray 객체'라고 부르며, 이는 list와 거의 비슷하다.
numpy는 하나의 data type만 배열에 넣을 수 있다. 이것은 list와 가장 큰 차이점이다. (dynamic typing을 지원하지 않음)
test_array = np.array([1, 2, 3, 4], float)
print(test_array)
## array([1., 2., 3., 4.])
type(test_array[3])
## numpy.float64
- shape : numpy array의 dimension 구성을 반환함
- dtype : numpy array의 data type을 반환함
test_array.dtype
## dtype('float64')
test_array.shape
## (4, )
numpy의 data type은 C와 compatible하다.
Handling shape
- reshape : array의 shape의 크기를 변경한다. element의 갯수는 동일하다.
test = [[1,2,3,4], [5,6,7,8]]
np.array(test).shape
## (2, 4)
np.array(test).reshape(8,)
## array([1,2,3,4,5,6,7,8])
np.array(test).reshape(2, 4).shape
## (2, 4)
np.array(test).reshape(-1, 2).shape
## (4, 2)
reshape을 사용할 때, -1을 사용하게 되면 array의 총 size를 기반으로 개수를 자동으로 설정해준다.
np.array(test).reshape(2, 2, 2)
## array([[[1, 2],
## [3, 4]],
## [[5, 6],
## [7, 8]]])
np.array(test).reshape(1, -1, 2).shape
## (1, 4, 2)
- flatten : 다차원 array를 1차원 array로 변환 (reshape에서의 일부 기능을 떼어온 것)
test = np.array([[[1,2,3,4], [5,6,7,8]],
[[1,2,3,4], [5,6,7,8]]])
test.shape
## (2, 2, 4)
test.flatten()
## (16, )
Indexing
- list와는 달리 2차원 배열에서 [0, 0] 표기법을 제공한다.
- matrix에서는 앞은 row, 뒤는 column을 의미한다.
test = np.array([[1, 2], [3, 4]], int)
a[0, 0]
## 1
a[0][0]
## 1
Slicing
- list와 달리 행과 열 부분을 나누어서 slicing이 가능하다.
- matrix의 부분 집합을 추출할 때 주로 사용된다.
test = np.array([[1,2,3,4], [5,6,7,8]], int)
test.[:, 2:]
## array([[3,4], [7,8]])
creation function
- arange : array의 범위를 지정해서 값의 list를 생성하는 명령어
np.arange(10)
## array([0,1,2,3,4,5,6,7,8,9])
np.arange(0, 2, 0.5) # step으로 floating point 표시 가능하다.
## array([0, 0.5, 1, 1.5])
- zeros : 0으로 가득찬 ndarray 생성
- ones : 1로 가득찬 ndarray 생성
- empty : shape만 주어지고, 비어있는 ndarray 생성(memory initialization 안됨)
- ones_like / zeros_like / empty_like : 기존 ndarray의 shape 크기 만큼 1, 0, 또는 empty array를 반환한다.
np.zeros(shape = (5, ), dtype = np.int8)
## array([0,0,0,0,0], dtype = int8)
np.ones(shape = (5, ), dtype = np.int8)
## array([1,1,1,1,1], dtype = int8)
np.empty(shape = (5, ), dtype = np.int8)
## array([0, 0, 64, -47, 105], dtype = int8) #실행시킬 때 마다 값이 계속 바뀔 것임
- identity : 단위 행렬을 생성함
np.identity(n=3, dtype=np.int8)
## array([[1,0,0], [0,1,0], [0,0,1]], dtype=int8)
np.identity(3)
## array([[1,0,0], [0,1,0], [0,0,1]], dtype=int8)
- eye : 대각선이 1인 행렬을 생성한다. k값의 시작 index의 변경이 가능하다.
np.eye(3)
## array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])
np.eye(3, 5, k=2)
## array([[0.,0.,1.,0.,0.],[0.,0.,0.,1.,0.],[0.,0.,0.,0.,1.]])
np.eye(N=3, M=5, dtype=np.int8)
## array([[1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0]], dtype=int8)
- diag : 대각 행렬의 값을 추출한다.
matrix = np.arange(9).reshape(3, 3)
np.diag(matrix)
## array([0, 4, 8])
np.diag(matrix, k=1) # k는 start index를 말한다.
## array([1, 5])
- ramdom sampling : 데이터 분포에 따른 sampling으로 array를 생성한다.
# 균등분포 (0은 시작값, 1은 끝값, 10은 데이터 개수)
np.random.uniform(0, 1, 10).reshape(2, 5)
# 정규분포 (0은 시작값, 1은 끝값, 10은 데이터 개수)
np.random.normal(0, 1, 10).reshape(2, 5)
operation functions
- sum : ndarray의 element들 간의 합을 구한다. list의 sum과 동일하다.
- mean : element들 간의 평균을 반환한다.
- std : element들 간의 표준 편차를 반환한다.
- axis : 모든 operation function을 실행할 때, 기준이 되는 dimension 축 (axis=0은 행의 개수를 기반으로, axis=1은 열의 개수를 기반으로 작동)
- concatenate : numpy array를 합치는(붙이는) 함수
a = np.array([1,2,3])
b = np.arary([4,5,6])
np.vstack((a, b))
## array([[1,2,3], [4,5,6]])
np.hstack((a, b))
## array([[1,2], [3,4], [5,6]])
a = np.array([1,2,3])
b = np.arary([4,5,6])
np.concatenate((a, b), axis=0)
## array([[1,2,3], [4,5,6]])
np.concatenate((a, b.T), axis=1)
## array([[1,2,3], [4,5,6]])
array operations
- array간 shape이 같을 때, 기본적인 사칙연산을 지원한다. (element-wise operations)
- dot product : matrix의 기본 연산으로, dot 함수를 사용한다. 행렬간의 곱셈연산을 할 때 사용한다.
- transpose : 전치 행렬이다. transpose 또는 T 를 사용해서 표현한다.
- broadcasting : shape이 다른 배열 간 연산을 지원하는 기능. scaler-vector외에도 vector-matrix간의 연산도 지원한다.
comparisons
- any : 하나라도 조건에 만족한다면 True
- all : 모두가 조건에 만족한다면 True
- numpy는 배열의 크기가 동일하다면, element간 비교 결과를 boolean type으로 반환한다.
a = np.arange(5)
a
## array([0, 1, 2, 3, 4])
a < 4 # boradcasting이 적용됨
## array([True, True, True, False])
np.all(a < 5)
## True
np.any(a < 3)
## True
- np.where : index 값 반환
- np.isnan : 숫자가 없을 때, True 반환
- np.isfinite : finite number일 때, True 반환
- np.argmax / np.argmin : array 내 최대값 또는 최소값의 index를 반환함 ( axis 기반으로 반환한다. )
7강. Pandas
pandas의 특징은 다음과 같다.
- 구조화된 데이터의 처리를 지원하는 python 라이브러리
- panel data의 준말
- R 언어와 유사한 기능을 가짐
- 고성능 array 계산 라이브러리인 numpy와 통합하여 강력한 스프레드시트 처리 기능을 제공함
- 인덱싱, 연산용 함수, 전처리 함수 등을 제공함
- 데이터 처리 및 통계 분석을 위해 사용함
pandas를 사용하여 주로 처리하는 파일 명칭은 다음과 같다.
이러한 데이터 형태를 Tabular 라고 한다.
회고
python에 대해 모르지 않는다고 생각한다. 그래도 이 강의를 들으면서 헷갈렸던 부분이나, 몰랐던 부분들을 조금씩 알게 되었다. 앞으로 파이썬을 더 자주 쓰며 연습을 많이 해봐야겠다.
위 내용은 부스트캠프 AI Tech 에서 제공한 내용을 바탕으로 작성하였습니다.
'부스트캠프 AI Tech' 카테고리의 다른 글
3주차 - 최적화 (0) | 2022.10.05 |
---|---|
3주차 - 딥러닝 기본 (0) | 2022.10.04 |
2주차 - PyTorch 구조 학습하기 (0) | 2022.09.30 |
2주차 - Pytorch 기본 (0) | 2022.09.29 |
1주차 - AI Math (9/19 ~ 9/23) (1) | 2022.09.23 |