0904
3주차-Day1) python으로 데이터 다루기 - numpy
Git이란?
Git은 '분산 버전 관리 시스템'으로 다수의 사람이 한 코드를 동시에 관리할 수 있게 한다.
# 간단하게 명령어 위주 정리
- 우선 Git 사이트에 접속해 다운로드를 받은 후 진행해야 한다.
git init # 로컬 저장소 생성
git status
git commit -m "add example.py" #변경사항이 반영된 new commit 생성
git add example.py #커밋을 반영할 파일을 지정
git log #commit 기록 확인하기
Git의 Branch
Branch는 코드의 흐름을 '분산'해준다 (가지치기)
# 간단하게 명령어 위주 정리
git branch <branch_name> #새로운 branch 생성
git checkout <branch_name> #현재 작업 중인 branch를 전환
git merge <branch_name> #현재 작업 중인 branch를 원하는 branch에 병합
git branch -d <branch_name> #branch 삭제
Git과 GitHub
GitHub는 '원격 저장소'로, 다른 사람과의 '협업'을 가능하게 해준다
# 간단하게 명령어 위주 정리
git remote add <별칭> <원격저장소 주소> #원하는 주소의 원격저장소에 branch 넣을 준비(이후부터는 별칭으로 이용)
git remote -v #상태 확인
git push <remote_repo_name> <branch_name> #branch 원격저장소에 푸시
git branch -M main #메인 branch 선정
git clone <repo_uri> <directory> #디렉터리에 해당 Git을 clone한다
NumPy의 연산
NumPy를 이용한 '행렬 연산'
# 간단하게 명령어 위주 정리
- 벡터 생성하기
arr = np.array([1, 2, 3]) #1차원
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) #2차원
arr.shape #(3.)
arr_2d.shape #(3, 3)
- 벡터와 스칼라 연산
x = np.array([1, 2, 3])
c = 5
print("더하기: {}".format(x + c)) #더하기: [6 7 8]
print("빼기: {}".format(x - c)) #빼기: [-4 -3 -2]
print("곱하기: {}".format(x * c)) #곱하기: [5 10 15]
print("나누기: {}".format(x / c)) #나누기: [0.2 0.4 0.6]
- 벡터와 벡터 연산 : 벡터의 같은 인덱스끼리 연산 진행
y = np.array([1, 3, 5])
z = np.array([2, 9, 20])
print("더하기: {}".format(y + z)) #더하기: [3 12 25]
print("빼기: {}".format(y - z)) #빼기: [-1 -6 -15]
print("곱하기: {}".format(y * z)) #곱하기: [2 27 100]
print("나누기: {}".format(y / z)) #나누기: [0.5 0.3333333 0.25]
Array의 'Indexing', 'Slicing'
# 간단하게 명령어 위주 정리
- python의 List와 유사하게 진행
w = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
w[0, 0] #1
w[2, 3] #12
w[0:2, 1:3] #array([[2, 3], [6, 7]])
w[0:2, 0:4] #arrau([[1, 2, 3, 4], [5, 6, 7, 8]])
w[0:2] #arrau([[1, 2, 3, 4], [5, 6, 7, 8]])
w[0:2,:] #arrau([[1, 2, 3, 4], [5, 6, 7, 8]])
w[0:3, 2:4] #array([[3, 4], [7, 8], [11, 12]])
w[:, 2:4] #array([[3, 4], [7, 8], [11, 12]])
Array의 'Broadcasting'
# 기본적으로 같은 type의 data에 대해서만 연산이 가능하기 때문에 피연산자 연산 가능하게 변환
# 간단하게 명령어 위주 정리
- M by N, M by 1
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
x = np.array([0, 1, 0])
x = x[:, None] # x 전치
print(a + x) # ([[1 2 3] [5 6 7] [7 8 9]])
- M by N, 1 by N
y = np.array([0, 1, -1])
print(a + y) # ([[0 2 -3] [0 5 -6] [0 8 -9])
- M by 1, 1 by N
t = np.array([1, 2, 3]) #열벡터로 바꿔야 함
t = t[:, None]
u = np.array([2, 0, -2])
print(t + u) # ([[3 1 -1] [4 2 0] [5 3 1]])
NumPy와 선형대수
NumPy로 '선형대수' 지식 끼얹기
# 간단하게 명령어 위주 정리
- 영벡터(행렬) : 원소가 모두 0인 벡터
np.zeros(3) #array([0., 0., 0.])
np.zeros((3, 3, 3))
#array([[[0., 0., 0.],
# [0., 0., 0.],
# [0., 0., 0.]],
# [[0., 0., 0.],
# [0., 0., 0.],
# [0., 0., 0.]],
# [[0., 0., 0.],
# [0., 0., 0.],
# [0., 0., 0.]]])
- 일벡터(행렬) : 원소가 모두 1인 벡터
np.ones(2) #array([2., 1.])
np.ones((3, 3))
#array([[1., 1., 1.],
# [1., 1., 1.],
# [1., 1., 1.]])
- 대각행렬(diagonal matrix) : main diagonal을 제외한 성분이 0인 행렬
np.diag((2, 4))
#array([[2, 0],
# [0, 4]])
np.diag((1, 3, 5))
#array([[1, 0, 0],
# [0, 3, 0],
# [0, 0, 5]])
- 항등행렬(identity matrix) : main diagonal이 1인 대각행렬
np.eye((2, dtype=int))
#array([[1, 0],
# [0, 1]])
np.eye((3, dtype=float))
#array([[1., 0., 0.],
# [0., 1., 0.],
# [0., 0., 1.]])
- 행렬곱(dot product) : 행렬간의 곱셈
mat_1 = np.array([[1, 4], [2, 3]])
mat_2 = np.array([[7, 9], [0, 6]])
mat_1.dot(mat_2)
#array([[ 7, 33],
# [14, 36]])
mat_1 @ mat_2
#array([[ 7, 33],
# [14, 36]])
- 트레이스(trace) : Main diagonal의 합
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr
#array([[1, 2, 3],
# [4, 5, 6]
# [7, 8, 9]])
arr.trace() # 15
np.eye(2, dtype=int).trace() # 2
- 행렬식(determinant) :행렬을 대표하는 값들 중 하나, 선형변환
arr_2 = np.array([[2, 3], [1, 6]])
arr_2
#array([[2, 3],
# [1, 6]])
np.linalg.det(arr_2) #9.000000000002
arr_3 = np.array([[1, 4, 7], [2, 5, 8], [3, 6, 9]])
arr_3
#array([[1, 4, 7],
# [2, 5, 8]
# [3, 6, 9]])
np.linalg.det(arr_3) #0.0
- 역행렬 : 행렬 A에 대해 AB=BA=1을 만족하는 행렬 B=A^-1
mat = np.array([[1, 4], [2, 3]])
mat
#array([[1, 4],
# [2, 3]])
mat_inv = np.linalg.inv(mat)
mat_inv
#array([[ -0.6, 0.8],
# [ 0.4, -0.2]])
mat@mat_inv
#array([[ 1.00000000e+00, 0.00000000e+00],
# [-1.11022302e-16, 1.00000000e+00]])
- 고유값과 고유벡터(eigenvalue and eigenvector) : 정방행렬 A에 대해 Ax=(람다)x를 만족하는 상수 람다와 이에 대응하는 벡터
mat = np.array([[2, 0, -2], [1, 1, -2], [0, 0, 1]])
mat
#array([[2, 0, -2],
# [1, 1, -2],
# [0, 0, 1]])
np.linalg.eig(mat)
#(array([1., 2., 1.]),
# array([[0. , 0.70710678, 0.89442719],
# [1. , 0.70710678, 0. ],
# [0. , 0. , 0.4472136 ]]))
eig_val, eig_vec = np.linalg.eig(mat)
eig_val
# array([1., 2., 1.])
eig_vec
# array([[0. , 0.70710678, 0.89442719],
# [1. , 0.70710678, 0. ],
# [0. , 0. , 0.4472136 ]]))
mat @ eig_vec[:, 0] #Ax
# array([0., 1., 0.])
eig_val[0] @ eig_vec[:, 0] #(lambda)x
# array([0., 1., 0.])
'프로그래머스 데브 코스 > TIL' 카테고리의 다른 글
[6기] 프로그래머스 인공지능 데브코스 6일차 TIL (0) | 2023.09.06 |
---|---|
[6기] 프로그래머스 인공지능 데브코스 5일차 TIL (0) | 2023.09.05 |
[6기] 프로그래머스 인공지능 데브코스 3일차 TIL (0) | 2023.09.03 |
[6기] 프로그래머스 인공지능 데브코스 2일차 TIL (0) | 2023.09.02 |
[6기] 프로그래머스 인공지능 데브코스 1일차 TIL (0) | 2023.09.01 |