Data Science/Study 자료
멀티캠퍼스 2주차 -2
낭만장도리
2024. 1. 4. 09:01
복습
가상환경
virtualenv conda pipenv
생성 virtualenv venv conda create~ -n myenv python = 버전
접속 mac/window (PowerShell, Git Bash) / conda actuvate myenv
source venv/ Scripts/activate
필요한 라이브러리 설치
pip install 라이브러리명 / conda install 라이브러리
해제 deactivate conda deactivate
MAC의 경우 환경변수 파일을 열어서 수동으로 세팅
Vi편집기를 통해서 세팅
터미널 - vi~/.zshrc
vi main.py
i : insert
:wq(저장)
Numpy
- 선형대수, 행렬 수치연산과 관련된 라이브러리
- 통계 포커싱두고 공부 > 응용,해석을 위주로 공부를 해야함 (원리x)
In [ ]:
import numpy as np # 넘파이 라이브러리 불러오기
print(np.__version__)
1.26.2
In [ ]:
num1 = [1, 2, 3, 4]
num2 = [3, 4, 5, 6]
#넘파이의 배열로 만들어준다
In [ ]:
arr1 = np.array(num1)
arr2 = np.array(num2)
arr1
Out[ ]:
array([1, 2, 3, 4])
In [ ]:
arr2
Out[ ]:
array([3, 4, 5, 6])
In [ ]:
arr1 + arr2
Out[ ]:
array([ 4, 6, 8, 10])
In [ ]:
#핵심은 np.array 같은 변환 명령어
In [ ]:
data1 = [0,1,2,3,4,5]
a1 = np.array(data1)
a1
Out[ ]:
array([0, 1, 2, 3, 4, 5])
In [ ]:
a1.dtype #넘파이는 비트 타입으로 int가 표기됨 (메모리 관리)
Out[ ]:
dtype('int64')
In [ ]:
np.array([0.5,2,0.01,8]).dtype
Out[ ]:
dtype('float64')
Numpy 배열 생성
- 1차원, 2차원, 3차원..배열생성
In [ ]:
np.arange(0,10,2)
Out[ ]:
array([0, 2, 4, 6, 8])
In [ ]:
np.arange(1,10) #반복문 for range와 비슷
Out[ ]:
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
In [ ]:
np.arange(10) #1차원배열
Out[ ]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [ ]:
np.arange(12).reshape(4,3)
Out[ ]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
In [ ]:
np.arange(12).reshape(4, 1, 3)
Out[ ]:
array([[[ 0, 1, 2]],
[[ 3, 4, 5]],
[[ 6, 7, 8]],
[[ 9, 10, 11]]])
In [ ]:
np.arange(12).reshape(2, 2, 3)
Out[ ]:
array([[[ 0, 1, 2],
[ 3, 4, 5]],
[[ 6, 7, 8],
[ 9, 10, 11]]])
In [ ]:
b1 = np.arange(12).reshape(2, 2, 3)
b1.shape #차원확인,튜플형태
Out[ ]:
(2, 2, 3)
In [ ]:
b2 = np.arange(5)
b2.shape #1차원 확인
Out[ ]:
(5,)
In [ ]:
#범위의 시작과 끝을 정하고 배열 생성
np.linspace(0,10,5) #(처음인덱스, 끝인덱스, 원하는원소갯수)
Out[ ]:
array([ 0. , 2.5, 5. , 7.5, 10. ])
In [ ]:
np.linspace(0, np.pi, 20)
Out[ ]:
array([0. , 0.16534698, 0.33069396, 0.49604095, 0.66138793,
0.82673491, 0.99208189, 1.15742887, 1.32277585, 1.48812284,
1.65346982, 1.8188168 , 1.98416378, 2.14951076, 2.31485774,
2.48020473, 2.64555171, 2.81089869, 2.97624567, 3.14159265])
In [ ]:
np.zeros(10)
Out[ ]:
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
In [ ]:
np.zeros((2,2))
Out[ ]:
array([[0., 0.],
[0., 0.]])
In [ ]:
np.ones(10)
Out[ ]:
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
In [ ]:
np.ones((2,2))
Out[ ]:
array([[1., 1.],
[1., 1.]])
NumPy 기초 문법 배우는 이유
- 문과생 : 데이터분석가, 기초문법 있구나 ! 끝
- 이공계 : 수치연산, 배열, 수식을 활용해서 문제 풀이
- 클래스, 딥러닝클래스, Numpy를 활용해서 딥러닝 알고리즘을 적용해서 클래스 & 라이브러리
- 밑바닥부터 시작하는 딥러닝3
In [ ]:
# 단위행렬
arr_I = np.eye(3)
arr_I
Out[ ]:
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
In [ ]:
arr_I.shape
Out[ ]:
(3, 3)
In [ ]:
np.array(['1.5','0.62']) # U4 유니코드, 데이터 형변환
Out[ ]:
array(['1.5', '0.62'], dtype='<U4')
데이터 형변환
In [ ]:
# astype() #판다스에도 사용
arr = np.array(['1.5','0.62']) #문자로 들어갔을때
num_arr = arr.astype(float) #한꺼번에 처리할때 유용
num_arr.dtype
Out[ ]:
dtype('float64')
In [ ]:
np.array(['1.5','0.62'],dtype = float) #처음에 넣을때 이렇게 넣어주면 좋음
Out[ ]:
array([1.5 , 0.62])
In [ ]:
num_f1 = np.array([10,21,0.549,4.75,5.98])
num_f1 = num_f1.astype(int)
num_f1
Out[ ]:
array([10, 21, 0, 4, 5])
In [ ]:
num_f1 = np.array([10,21,0.549,4.75,5.98])
num_f1 = num_f1.astype(float)
num_f1
Out[ ]:
array([10. , 21. , 0.549, 4.75 , 5.98 ])
In [ ]:
# p .224
#난수 = 무작위로 숫자를 추출
np.random.rand(2,3)#()배열의 크기 #0~1사이의 실수 난수를 갖음
Out[ ]:
array([[0.32115698, 0.93642616, 0.07870425],
[0.85189278, 0.15882247, 0.33017485]])
In [ ]:
np.random.randint(2,10) #범위를 줌
Out[ ]:
3
In [ ]:
np.random.randint(1,100, 10)
Out[ ]:
array([24, 90, 24, 38, 14, 39, 83, 48, 43, 94])
로또번호 뽑기
In [ ]:
def lotto(n): # n개를 받아드릴 함수
numbers = [] # 로또 번호를 담아줄 빈 리스트 생성
while len(numbers) < n: # 횟수 n번을 반복해 줄 반복문
num = np.random.randint(1, 45) # 랜덤한 숫자 뽑기
if num not in numbers: # 중복되는 숫자가 있는지 체크
numbers.append(num) #없다면 리스트에 추가
return numbers #반복구문을 완료한 리스트를 리턴
In [ ]:
print(lotto(7))
[1, 25, 30, 41, 21, 8, 34]
In [ ]:
#황유진
# 로또 번호 추첨기 만들어보기
# 조건1: 보너스숫자와 로또 메인 번호는 겹치지 않아야
# 조건2: 로또번호 내에서도 겹치는 숫자 없어야
# 조건3: 로또 번호(보너스 제외)는 오름차순으로 정렬되어야
lotto = np.random.randint(1, 46, size=(6, ))
bonus = np.random.randint(1, 46)
lotto = np.sort(lotto) # 조건3
# way1
if bonus not in lotto:
if np.unique(lotto).size == len(lotto): # 2, 3, 3, 6, 10, 22 고유값 2, 3, 6, 10, 22
print(f'이번 주 로또 당첨번호는 {lotto} + 보너스번호 {bonus}')
# way2
if bonus not in lotto:
if np.unique(lotto).size == len(lotto):
print(f'이번 주 로또 당첨번호는', end=' ')
for i in range(6):
print(lotto[i], end=' ')
if i == 5:
print(f'+ 보너스번호 ', bonus)
이번 주 로또 당첨번호는 [ 7 16 25 40 43 45] + 보너스번호 22
이번 주 로또 당첨번호는 7 16 25 40 43 45 + 보너스번호 22
In [ ]:
#임예원(GPT)
def generate_lotto_numbers():
# 1부터 45까지의 숫자 중에서 6개를 무작위로 선택
lotto_numbers = np.random.choice(range(1, 46), size=6, replace=False)
# 선택된 숫자들을 정렬
lotto_numbers.sort()
return lotto_numbers
if __name__ == "__main__":
# 로또 번호 생성 및 출력
lotto_result = generate_lotto_numbers()
print("로또 번호: ", lotto_result)
로또 번호: [ 7 11 13 14 32 44]
배열의 연산
- p.225
In [ ]:
arr1 = np.array([10, 20, 30, 40])
arr2 = np.array([1, 2, 3, 4])
print(arr1 + arr2)
print(arr1 - arr2)
print(arr1 * arr2)
print(arr1 / arr2)
[11 22 33 44]
[ 9 18 27 36]
[ 10 40 90 160]
[10. 10. 10. 10.]
비교연산
In [ ]:
arr1 > 20
Out[ ]:
array([False, False, True, True])
통계연산
- NumPy, 합, 편균, 표준편차, 분산, 최솟값, 최댓값, 누적합, 누적 곱 메서드가 존재한다. -기술통계량 (Descriptive Statistics) : 현재 데이터 상태를 표현(=묘사)한다.
- 통계 : 평균이 전부다!
In [ ]:
arr3 =np.arange(5)
arr3
Out[ ]:
array([0, 1, 2, 3, 4])
In [ ]:
arr3.sum() #전체합
Out[ ]:
10
In [ ]:
arr3.mean() #평균
Out[ ]:
2.0
In [ ]:
arr3.std() #표준편차 루트분산
Out[ ]:
1.4142135623730951
In [ ]:
arr3.var() #분산(평균 - 각값 의 제곱의 평균)
Out[ ]:
2.0
누적합과 누적곱
- cumsum() : 누적합
- cumprod() : 누적곱
In [ ]:
arr4 = np.arange(1, 5)
arr4
Out[ ]:
array([1, 2, 3, 4])
In [ ]:
arr4.cumsum()
Out[ ]:
array([ 1, 3, 6, 10])
In [ ]:
arr4.cumprod()
Out[ ]:
array([ 1, 2, 6, 24])
행렬연산
- 선형대수 (linear algebra)를 위한 2차원 배열 연산도 지원
- p.229 행렬곱, 전치행렬, 역행렬, 행렬식 사용 예시
In [ ]:
A = np.array([0,1,2,3]).reshape(2,2)
A
Out[ ]:
array([[0, 1],
[2, 3]])
In [ ]:
B = np.array([3,2,0,1]).reshape(2,2)
B
Out[ ]:
array([[3, 2],
[0, 1]])
In [ ]:
A.dot(B)
Out[ ]:
array([[0, 1],
[6, 7]])
In [ ]:
A.transpose() #전치행렬
Out[ ]:
array([[0, 2],
[1, 3]])
배열의 인덱싱과 슬라이싱
- string, list,tuple과 동일한 방법으로 접근
In [ ]:
a1 = np.array([0, 10, 20, 30, 40, 50])
In [ ]:
a1
Out[ ]:
array([ 0, 10, 20, 30, 40, 50])
In [ ]:
a1[4] #인덱싱으로 불러옴
Out[ ]:
40
In [ ]:
#50 을 70으로 변경
a1[5] = 70
a1
Out[ ]:
array([ 0, 10, 20, 30, 40, 70])
In [ ]:
#리스트 통해서 추출
a1 [[0,2,4]] #인덱스 번호
Out[ ]:
array([ 0, 20, 40])
In [ ]:
a1[:3]
Out[ ]:
array([ 0, 10, 20])
이차원 배열 인덱싱 슬라이싱
In [ ]:
a2 = np.arange(10,100,10).reshape(3,3)
a2
Out[ ]:
array([[10, 20, 30],
[40, 50, 60],
[70, 80, 90]])
In [ ]:
a2[2,1] #중요함
Out[ ]:
80
In [ ]:
a2[2,2] = 95
In [ ]:
a2
Out[ ]:
array([[10, 20, 30],
[40, 50, 60],
[70, 80, 95]])
In [ ]:
a2[0] = [30,20,10]
a2
Out[ ]:
array([[30, 20, 10],
[40, 50, 60],
[70, 80, 95]])
In [ ]:
a2[0] = np.array([30, 20, 10]) #정석
In [ ]:
a2
Out[ ]:
array([[30, 20, 10],
[40, 50, 60],
[70, 80, 95]])
In [ ]:
a2[0] = np.array([30, 20, 10, 1]) #에러 확인용
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[131], line 1
----> 1 a2[0] = np.array([30, 20, 10, 1])
ValueError: could not broadcast input array from shape (4,) into shape (3,)
- 2차원 배열의 행과 열 위치 지정해거 원소 추출 + (행의 위치1, 열의 위치1)/행의 위치2, 열의 위치2
In [ ]:
a2[[0,2],[0,1]] #[0,0], [2,1]로 이해 해야함
Out[ ]:
array([30, 80])
In [ ]:
a2
Out[ ]:
array([[30, 20, 10],
[40, 50, 60],
[70, 80, 95]])
배열의 조건문
-pandas 문법과 유사
In [ ]:
a = np.array([1,2,3,4,5,6])
a
Out[ ]:
array([1, 2, 3, 4, 5, 6])
In [ ]:
[a>3]
Out[ ]:
[array([False, False, False, True, True, True])]
In [ ]:
a[a!=3] #불린을 통한 트루 값을 가져온다
Out[ ]:
array([1, 2, 4, 5, 6])
배열의 슬라이싱 p.234
In [ ]:
b1 = np.array([0,1,2,3,4,5])
b1[1:4]
Out[ ]:
array([1, 2, 3])
In [ ]:
b1[:3]
Out[ ]:
array([0, 1, 2])
In [ ]:
b1[0:4:2]
Out[ ]:
array([0, 2])
In [ ]:
#p.235
In [ ]:
b1[2:5] = np.array([25,35,45])
In [ ]:
b1
Out[ ]:
array([ 0, 1, 25, 35, 45, 5])
In [ ]:
b1[3:6] = 60
b1
Out[ ]:
array([ 0, 1, 25, 60, 60, 60])
In [ ]:
b2 = np.arange(10,100,10).reshape(3,3)
b2
Out[ ]:
array([[10, 20, 30],
[40, 50, 60],
[70, 80, 90]])
In [ ]:
b2[1:3,1:3]
Out[ ]:
array([[50, 60],
[80, 90]])
In [ ]:
b2[1:,1:]
Out[ ]:
array([[50, 60],
[80, 90]])
In [ ]:
b2[1][0:2]
Out[ ]:
array([40, 50])
NumPy 조건문
- np.where : 단일 조건문
- np.select : 다중 조건문
- 판다스에서 응용가능
In [ ]:
arr = np.arange(10)
arr
Out[ ]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [ ]:
#0, 1, 2, 3, 4, 50, 60, 70, 80, 90
In [ ]:
np.where(arr < 5,arr,arr*10)
Out[ ]:
array([ 0, 1, 2, 3, 4, 50, 60, 70, 80, 90])
In [ ]:
arr = np.arange(10)
arr
Out[ ]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [ ]:
#100, 101, 2, 3, 4, 5, 12, 14, 16, 18
#조건1 2미만일때는 100을 더해라
#조건2 5초과 일떄는 곱하기 2를 해줘라
#조건식과 대응 되는 결과를 리스트로 만들기
cond_list = [arr > 5, arr < 2]
choice_list = [arr * 2, arr + 100]
np.select(cond_list, choice_list,default = arr)
Out[ ]:
array([100, 101, 2, 3, 4, 5, 12, 14, 16, 18])