BASEMENT
Python 6주차 - 1 본문

파이썬 실습
1. 중복 없는 튜플 형태 (ex: (9,2,4,5)) 를 입력하면
{9},{9,2},{9,2,4},{9,2,4,5} 형태로 리스트에 담아서 출력
def tuple_ss(ts):
result = []
s = ts[1:len(ts)-1].replace("},","}=").split("=") # ts[1:len(ts)-1] : {} 제거 // {},{},{} 상태를 {}={}={}로 변경후 '=' 기준으로 분리
s = sorted([x[1:len(x)-1].split(',') for x in s], key=lambda x: len(x))
result = [int(i) for i in s[-1]] # {1,2,3}을 {1,2,3} 으로 변경 후 정렬
return result
if __name__ == "__main__":
ts = input("중복없는 튜플의 집합 형태 입력")
print(tuple_ss(ts))
2. 영어의 끝말잇기 게임 프로그램 작성
리스트로 주어진 영어 단어집 작성
- 모두 소문자
- 단어집의 단어 개수는 3이상 50이하
- 단어의 길이는 2이상 30 이하
참여자 수 입력 (2~5명)
몇 번째 참여자가 몇 번째 차례에서 탈락하는지 출력
끝말잇기의 올바른 단어가 아니거나, 앞선 사람이 이미 말한 단어의 중복일 경우 탈락, 주어진 단어집의 끝까지 탈락자가 없을 경우 [0,0] 반환함
def word_chain(gamer,words):
first = [words[0]]
prev = words[0]
for i in range(1,len(words)):
if prev[-1] != words[i][0] or words[i] in first:
return [(i%gamer)+1, (i//gamer)+1]
first.append(words[i])
prev = words[i]
return [0,0]
if __name__ == "__main__":
words = ["banana", "apple", "elephant", "table", "error", "rode"]
game_n = int(input("enter number of gmaer>> "))
print(word_chain(game_n, words))
3. 2차원 행렬 A와 B를 입력 받아 두 행렬의 곱을 구하는 함수 작성
- 행렬의 곱은 내적의 곱을 의미
- A*B의 경우 A의 열의 사이즈와 B의 행의 사이즈가 동일해야 곱 가능
- A와 B 행렬을 구성하는 원소는 -10이상 20이하인 자연수
- A와 B행렬의 행과 열의 길이는 3이상 5이하
행렬의 곱 결과물 Transpose Matrix 코드 작성
- 전치행렬은 행과 열이 바뀐 행렬
- [[1,2,],[3,4]]의 전치행렬은 [[1,3],[2,4]]
import random
def matrix(n):
A = [[random.randint(-10,20) for i in range(n)] for i in range(n)]
B = [[random.randint(-10,20) for i in range(n)] for i in range(n)]
C = [[0 for i in range(n)] for i in range(n)]
for i in range(n):
for j in range(n):
for k in range(n):
C[i][j] = C[i][j] + A[i][k]*B[k][j]
print(A);print(B)
return C
if __name__ == "__main__":
n = int(input("ener size of matrix>> "))
result = matrix(n)
result_trans = [[i for i in j] for j in zip(*result)]
#result_trans = list(map(list, zip(*result)))
print(f'matrix result: {result}')
print(f'matrix trans: {result_trans}')
데이터 분석 분야의 수학
1. 확률/통계 및 선형대수학(linear algebra)
1) 선형 대수학의 필요성
- 데이터를 벡터로 표현
- 벡터 모임인 행렬을 통한 방정식 연산의 빠른 수행
2) 데이터를 벡터로 표현
- 데이터들을 표현하는 특징을 선형대수학의 기본 단위인 벡터로 표현함
- ex) A지역의 강수량 변화 - 연도, 월, 강수량의 데이터 표현
- ex) 영화 선호도 - B영화의 평점, C영화의 평점 데이터 표현
- ex) 영화 데이터 표현 - 장르, 감독, 출연배우, 개봉일 등
3) 데이터 표현식을 찾기 위해 필요
- 좌표계를 이용하여 데이터들을 표현하는 식을 찾는데 유용함 (ex: 회귀분석)
- 데이터를 가장 잘 표현하는 확률분포의 파라미터들을 축으로 좌표계를 생성 후, 오차를 축소시킴
4) 행렬 연산의 필요성
- 예측을 위한 회귀분석
- ex) 몸무게와 키의 관계 -> 몸무게가 주어지면 키값의 예측 가능
2. 벡터 (vector)
- 크기와 방향을 가진 요소 ex) 속도, 평행이동, 힘의 작용 등
- 벡터는 요소(변수)들의 1차원적 배열
- 벡터는 일종의 순서쌍
- 역벡터 : 크기는 같고 방향이 반대인 벡터
cf) 스칼라 (scalar) : 크기만을 가진 요소. (ex: 속력, 무게, 길이 등)
벡터는 요소들의 1차원적 배열로 정의 됨
- 열벡터 (column vector) : 세로로 배열된 벡터
- 행벡터 (row vector) : 가로로 배열된 벡터
1) 벡터의 덧셈과 뺄셈
2) 벡터의 동일성
- 동일 위치에 있는 요소들이 모두 같은 경우
- 두 벡터의 차는 영벡터(zero vector) -> 벡터의 항등원
3) 벡터에 대한 스칼라 곱
벡터 x에 스칼라 k를 곱하면 kx
4) 벡터 간의 곱셈 : 벡터간의 내적(inner product) -> 결과는 스칼라
ex) 세 과목의 점수 (80,97,88), 각 과목의 성적 반영률 (0.3,0.4,0.3) 이면 최종 점수는
0.3*80 + 0.4+97 + 0.3*88 = 89.2
3. 행렬 (matrix) 기본개념
1) 행렬(matrix)
- 요소(수 또는 변수)들이 2차원적으로 배열된 것
- 요소는 행렬 내에서의 위치를 하첨자로 부기함
- 행렬의 크기 : 행의 수와 열의 수로 정해짐 (ex: 2 by 3)
2) 행렬의 덧셈과 뺄셈
m x n 행렬 A = [aij]와 B = [bij]가 있을 때
A + B = [aij + bij]
A - B = [aij - bij]
3) 실수(스칼라)의 곱
m x n 행렬 A = [aij]와 실수 k가 있을 때
A * k = Ak =kA =[kaij]
4) 행렬의 곱
행렬의 곱은 벡터의 내적에서 출발 -> 차원의 일치
벡터 a와 벡터 b의 내적 -> a*b = a1b1 + a2b2
5) 영행렬 (zero matrix)
m x n 행렬 A가 있을때 모든 i, j에 대하여 aij = 0 인 행렬
A = O 라고 나타냄
6) 정방행렬 (square matrix)
m x n 행렬 A가 있을 때 m=n인 행렬
n x n 행렬로 나타냄
7) n차 정방행렬
n개의 행과 n개의 열로 구성된 정방행렬
n값 : 행렬의 차수 (order)
대각원소 : 대각선상의 원소 (a11, a22, ... ann)
대각행렬 : 대각원소 이외의 모든 원소가 0인 행렬
8) 단위행렬
정방행렬이면서 대각원소가 모두 1이고 그 외의 모든 원소가 0인 대각행렬
행렬곱의 항등행렬
I로 나타냄
cf) IA = A = AI
9) 전치행렬 (transpose matrix)
m x n 행렬 A가 있을 때 A의 행과 열을 서로 바꾼 행렬
AT로 나타냄
cf) 대칭행렬 : AT = A 인 행렬
10) 역행렬
임의의 정방행렬 Anxn에 대하여 정방행렬 Bnxn가 AB = BA = Inxn 를 만족하면, B를 A의 역행렬이라 하고 A-1로 표기함
행렬곱의 역원
11) 행렬식 (Determinant)
1차 연립방정식의 해를 구하기 위해 사용
역행렬의 유무 판별에도 사용
cf) 2,3차 이상의 행렬식은 라플라스(또는 여인수전개) 또는 크래머 방식을 이용하여 구함
A = [a b => ad - bd 가 0이 아니면 역행렬이 존재함
c d]
역행렬이 존재하지 않는 연립방정식 : 해가 없거나, 무수히 많은 경우에 해당됨
Numpy 모듈
1. Numpy 모듈 설치
Anaconda powershell 에서 'conda activate 가상환경이름' 으로 activate 한 후
conda install numpy 입력
2. Numpy 패키지
- 파이썬의 리스트는 원하는 타입들을 채울 수 있는 유연성이 있지만, 저장공간 낭비 등이 발생함
- Numpy의 배열은 유연성은 부족하지만(같은 데이터 형태만 가능), 데이터의 저장과 가공에 효율적
- 계산 또는 분석에 이용되어지는 라이브러리, 선형대수의 기본 원리
- list보다 빠른 계산 구조를 가진 array 생성
- array 형태이므로, 구성되는 값들은 모두 같은 자료형으로 구성
- Numpy의 사용 : import numpy as np
# list와 array의 차이
import numpy as np
list1 = [1,2,3,'b']
print(list1)
arr1 = np.array([1,2,3,'b'])
print(arr1)
arr2 = np.array([1,2,2.3,3])
print(arr2)
# array 생성
import numpy as np
a1 = np.array([1,2,3])
print(a1, a1.shape, a1.ndim)
print(type(a1))
print(a1[0], a1[1], a1[2])
print()
a2 = np.array([[1,2,3], [4,5,6]])
print(a2, a2.shape, a2.ndim)
print(a2[0], a2[1])
print(a2[0,0], a2[0][1], a2[0,2]) # [0,0] = [0][0]
# 데이터 기본 타입
import numpy as np
arr1 = np.zeros(20, dtype=np.float32)
arr2 = np.array([range(i,i+2) for i in range(2,5)], dtype='int32')
arr3 = np.array([range(i,i+4) for i in range(2,5)], dtype='float32')
print(arr1)
print(arr2)
print(arr3)
zeros, ones, full, eye, linspace
# zeros, ones, full, eye, linspace
import numpy as np
a = np.zeros((2,2));print(a)
b = np.ones((3,3));print(b)
c = np.full((2,3),5) # 5로 가득 채운 2x3 행렬 생성
print(c)
d = np.eye(3) # 단위행렬 생성 -> 정방행렬이므로 숫자 하나만 사용
print(d)
e = np.linspace(0,1,5) # 0~1 사이에서 균등하게 5개 생성
print(e)
f = np.arange(10) # 0~0 까지의 1씩 증가하는 정수 생성
print(f)
# _like() -> ()의 행렬과 같은 shape의 행렬을 생성함
a = np.array([[1,2,3], [4,5,6]]);print(a)
b = np.ones_like(a);print(b)
c = np.full_like(a,5);print(c)
d = np.zeros_like(a);print
numpy의 랜덤함수 사용
- random.random
- random.normal
- random.randint
- random.randn
- random.exponential
- random.uniform
# numpy 랜덤함수 사용
import numpy as np
ary1 = np.random.exponential(6,2) # mean(scale)=6, size=2
ary2 = np.random.random((3,3)) # 0~1 사이의 실수 균등분포, 3 by 3
ary3 = np.random.normal(2,1,(3,2)) # 평균:2, 편차:!, 정규분포, 3 by 2
ary4 = np.random.randn(2,3) # 표준정규분포, 평균:0, 편차:1
ary5 = np.random.randint(0,10,(2,2))
ary6 = np.random.uniform(1,5,2) # 1~5 사이의 uniform 분포
print(ary1)
print(ary2)
print(ary3)
print(ary4)
print(ary5)
print(ary6)
# random.seed
import numpy as np
np.random.seed(10) # seed : random값을 발생시킬때 start값을 고정해주어 동일한 범위에서 random값을 추출해줌
ary1 = np.random.randint(1,10,5)
arr2 = np.random.poisson(lam=2.0, size=5)
print(arr1)
print(arr2)
# 평균0, 표준편차1인 정규분포값을 10000발생 후 도표로 확인
import numpy as np
import matplotlib.pyplot as plt
data = np.random.normal(0,1,10000)
plt.hist(data, alpha=0.5, bins=100) # bins : 나누기양 (막대기 수)
plt.show()
# 평균2, 표준편차1인 값을 10000발생 후 도표로 확인하여 비교
import numpy as np
import matplotlib.pyplot as plt
data1 = np.random.normal(2,1,10000)
data2 = np.random.normal(0,1,10000)
plt.hist(data1, bins=50, color="green")
plt.hist(data2, alpha=0.5, bins=50)
plt.show()
# Sigmoid / Relu 함수의 분포 그리기
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
def sigmoid_f(x):
return 1 / (1+np.exp(-x))
def relu_f(x):
return np.maximum(0,x)
x = np.arange(-5.0, 5.0, 0.1)
y_relu = relu_f(x)
plt.plot(x,y_relu)
plt.show()
y_sigmoid = sigmoid_f(x)
plt.plot(x,y_sigmoid)
plt.show()
shuffle, choice, unique 모듈
import numpy as np
ary1 = np.array([1,2,2,3,4,4,5,6,7,8,8,8])
np.random.shuffle(ary1)
ary2 = np.random.choice(ary1,3)
ary3 = np.unique(ary1) # unique : 중복제거
print(ary1)
print(ary2)
print(ary3)
배열 index slicing
import numpy as np
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
b = a # b = a[:] 와 동일. 얕은 복사
a[0,0] = 100 # cf) a.copy : 깊은 복사
print(a)
print(b)
'Programming > Python' 카테고리의 다른 글
Python 7주차 - 1 (0) | 2020.07.29 |
---|---|
Python 6주차 - 2 (0) | 2020.07.26 |
Python 5주차 (0) | 2020.07.26 |
Python 4주차 - 2 (0) | 2020.07.12 |
Python 4주차 - 1 (0) | 2020.07.12 |