1. 넘파이(Numpy)
- 수학, 과학 계산용 패키지
- 자료구조(ndarray)를 제공 -> 파이썬의 list보다 속도가 빠름.
넘파이 사용 전 다운로드
import numpy as np # 넘파이를 사용하기 위해 import를 시켜준다.
1-1. ndarray
list1 = [1,2,3,4]
list2 = [[1,2,3,4],[5,6,7,8]]
print(list1)
print(list2)
print(type(list1))
print(type(list1[1]))
print(type(list2))
ndarr1 = np.array([1,2,3,4])
print(ndarr1)
print(type(ndarr1)) # ndarray = n dimension array
# 리스트를 ndarray로 변환하는 방법
ndarr1 = np.array(list1)
ndarr2 = np.array(list2)
print(ndarr1)
print(ndarr2)
print(type(ndarr1))
print(type(ndarr1[1]))
print(type(ndarr2))
1-2. ndarray의 data type
- ndarray는 list와 다르게 1개의 단일 데이터 타입만 허용
list1 = [1,3.14,'python','🤣',True]
ndarr1 = np.array([1,2,3,4])
ndarr1
ndarr2 = np.array([1,2,3.14,4]) # 모든 요소가 float로 변경됨
ndarr2 # 가장 큰 데이터 타입으로 바뀜
ndarr3 = np.array([1,2,3.14,True]) # 모든 요소 float로 변경
ndarr3
ndarr4 = np.array(['1',2,3.14,True]) # 모든 요소 String로 변경
ndarr4
ndarr3 = np.array([1,2,3.14,True], dtype=int) # 모든 요소 float로 변경
ndarr3
ndarr4 = np.array(['1',2,3.14,True], dtype=int) # 모든 요소 String로 변경
ndarr4 # 따옴표 떼고 숫자면 인티저 변경 가능
ndarr4 = np.array(['1','2','3.14','True'], dtype=int) # 모든 요소 String로 변경
ndarr4 # 따옴표 떼고 3.14가 float 면 작업이 두번이여서 오류
1-3. ndarray 슬라이싱
ndarr1 = np.array(['🍌','🥝','🍊','🍉','🍈'])
ndarr1
# 인덱싱
print(ndarr1[0])
print(ndarr1[4])
print(ndarr1[-1])
print(ndarr1[-2])
ndarr2d = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
ndarr2d.shape
print(ndarr2d[0,2])
print(ndarr2d[0][2])
# 0행 가져오기
print(ndarr2d[0])
print(ndarr2d[0,])
print(ndarr2d[0,:])
# 0열 가져오기
print(ndarr2d[:,0])
1-4. Fancy 인덱싱
- 범위가 아닌 특정 index의 집합의 값들을 선택해서 추출하고 싶을 때 사용
ndarr1 = np.array([10,15,2,8,20,90,85,44,23,32])
idx = [2,5,9]
ndarr1[idx]
ndarr2d = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
ndarr2d[[0,1],:]
1-5. Boolean 인덱싱
- 조건에 대한 필터링을 통해 Boolean 값을 이용한 색인을 사용
ndarr1 = np.array(['🍌','🥝','🍊','🍉','🍈'])
selValue = [True,False,True,True,False]
ndarr2d = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
ndarr2d > 7
2. 행렬 연산
2-1. 연산자
- 덧셈, 뺄셈, 곱셈, 나눗셈은 shape가 같아야함
- 같은 position끼리 연산
- 내적(dot product)은 맞닿는 shape가 같아야함
- 내적(dot product)은 떨어져 있는 shape가 결과 행렬이 됨
a = np.array([[1,2,3],[2,3,4]])
b = np.array([[3,4,5],[1,2,3]])
a.shape, b.shape # shape가 다르면 오류
# 덧셈, 뺄셈,나눗셈, 곱셈 연산
print(a+b)
print(a-b)
print(a*b)
print(a/b)
# dot product(행렬곱, 내적)
a = np.array([[1,2,3],[1,2,3],[2,3,4]])
b = np.array([[1,2],[3,4],[5,6]])
a.shape, b.shape
print((1*1 + 2*3 + 3*5), (1*2 + 2*4 + 3*6))
print((1*1 + 2*3 + 3*5), (1*2 + 2*4 + 3*6))
print((2*1 + 3*3 + 4*5), (2*2 + 3*4 + 4*6))
2-2. orange
arr2 = np.arange(1, 11)
arr2
for i in arr2:
print(i, end = " ")
2-3. sort
ndarr1 = np.array([1,10,5,7,2,4,3,6,8,9,])
ndarr1
np.sort(ndarr1) # 오름차순 정렬
# 문자열 역순으로 출력하기
str1 = 'Python'
print(str1[:]) # 모든 문자를 슬라이싱
print(str1[::]) # print(str1[::1]) -> : 정방향
print(str1[::-1]) # print(str1[::-1]) -> : 역방향
print(str1[4:1:-1]) # 4번 인덱스부터 1 직전까지 역순으로 가져오기
print(str1[4::-1]) # 4번 인덱스부터 0까지 역순으로 가져오기
ndarr2d = np.array([[11,10,12,9],[3,1,4,2],[5,6,7,8]])
ndarr2d.shape
# 행 정렬
np.sort(ndarr2d, axis = 0)
# 열 정렬
np.sort(ndarr2d, axis = 1)
# 열 정렬 내림차순
np.sort(ndarr2d,axis = 1)[:,::-1]
a = np.sort(ndarr2d, axis = 1)
np.sort(a, axis = 0)
2-4 숫자의 단일 연산
a = np.array([[1,2,3],[4,5,6]])
print(a+3)
print(a-3)
print(a*3)
print(a/3)
b = np.array([[3,3,3],[3,3,3]])
a+b