본문 바로가기

프로그래머스 데브 코스/TIL

[6기] 프로그래머스 인공지능 데브코스 4일차 TIL

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.])