1. 넘파이란?
•수학, 과학 계산용 패키지
•성능 : 파이썬 리스트보다 빠름
•메모리 사이즈 : 파이썬 리스트보다 적은 메모리를 사용
•빌트인 함수 : 선형대수, 여러 함수들을 내장
import numpy
#별칭(alias) 지정
import numpy as np
1-1 array (배열)
•여러 값들의 그룹
arr = np.array([1,2,3,4])
arr
array([1, 2, 3, 4])
type(arr) #ndarray = n dimension array
numpy.ndarray
list1 = [1,2,3,4]
list2 = ([1,2,3,4], [5,6,7,8])
print(list1)
print(list2)
[1, 2, 3, 4]
([1, 2, 3, 4], [5, 6, 7, 8])
#리스트로부터 ndarray 생성
arr1 = np.array(list1)
arr2 = np.array(list2)
arr1.shape #차원
arr2.shape
(4,)
(2,4)
1-2 array에서의 data 타입
•array에서는 list와는 다르게 1개의 단일 데이터 타입만 허용
list = [1, 3.14, '🎈', '1234']
list #[1, 3.14, '🎈', '1234']
list[2] #'🎈'
int와 float 타입이 같이 존재하는 경우
#float 타입으로 저장
arr = np.array([1,2,3,3.14])
arr #array([1. , 2. , 3. , 3.14])
#int와 float 타입이 같이 존재하는 경우, dtype을 int로 설정
arr = np.array([1,2,3,3.14], dtype=int)
arr #array([1, 2, 3, 3])
#int와 str 타입이 같이 존재하는 경우
arr = np.array([1,3.14,'🎈','1234'])
arr #array(['1', '3.14', '🎈', '1234'], dtype='<U32')
1-3 슬라이싱 (slicing)
•배열의 부분 선택
arr = np.array(['🎈','🎄','🎀','🎁','🎨'])
arr.shape #(5,)
arr = np.array(['🎈','🎄','🎀','🎁','🎨'])
print(arr[0]) #🎈
print(arr[4]) #🎨
•2차원 array
arr2d = np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
arr2d.shape #(3, 4)
arr2d[0,2] #3
arr2d[2,1] #10
•범위 색인
arr #array(['🎈', '🎄', '🎀', '🎁', '🎨'], dtype='<U1')
# index 1이상 끝까지
arr[1:] #array(['🎄', '🎀', '🎁', '🎨'], dtype='<U1')
# index 3미만까지
arr[:3] #array(['🎈', '🎄', '🎀'], dtype='<U1')
# index 1이상 3미만
arr[1:3] #array(['🎄', '🎀'], dtype='<U1')
arr[:1] #array(['🎈'], dtype='<U1')
# 0 row(행)을 모두 가져오기
arr2d[0,:] #array([1, 2, 3, 4])
# 1 col(열)을 모두 가져오기
arr2d[:,1] #array([ 2, 6, 10])
arr2d[:2,:] #array([[1, 2, 3, 4], [5, 6, 7, 8]])
arr2d[:2,2:] #array([[3, 4], [7, 8]])
1-4 Fancy 인덱싱
•범위가 아닌 특정 index의 집합의 값을 선택하여 추출하고 싶을 때 활용
arr = np.array([10, 23, 2, 7, 90, 65, 32, 66, 70])
idx = [1, 3, 5] #추출하고 싶은 인덱스를 괄호로 묶어 저장
arr[idx] #array([23, 7, 65])
arr2d = np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
arr2d[[0,1], :] #array([[1, 2, 3, 4], [5, 6, 7, 8]])
1-5 Boolean 인덱싱
•조건 필터링을 통하여 Boolean값을 이용한 색인
#True와 False 값으로 색인
myValue = [True, False, True]
arr[myValue] #array 값의 개수가 맞지 않음
myValue=[True, False, True, True, False]
arr[myValue] #array(['🎈', '🎀', '🎁'], dtype='<U1')
•조건필터
arr2d > 2 #array([[False, False, True, True], [ True, True, True, True], [ True, True, True, True]])
arr2d[arr2d>2] #array([ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
arr2d[arr2d<5] #array([1, 2, 3, 4])
2. Matrix(행렬)
2-1 행(row) + 열(column)
데이터 분석 및 기계학습에 있어서 행렬을 빼놓고 얘기할 수 없음
▸덧셈
- shape가 같아야 함
- 같은 position끼리 연산
▸뺄셈
- shape가 같아야 함
- 같은 position끼리 연산
▸곱셈
-맞닿는 shape가 같아야 함
2-2 arrange란?
•arrange: 순차적인 값을 생성할 때 사용
arr = [1,2,3,4,5,6,7,8,9,10]
arr #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
arr = np.arange(1,11)
arr #array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
arr = np.arange(start=1, stop=11)
arr #array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
arr = np.arange(start=1, stop=11, step=2)
arr #array([1, 3, 5, 7, 9])
2-3 range(numpy와는 상관없는 python문법)
•range는 범위를 지정해주는 함수
•보통 for in의 반복문에서 많이 사용
arr = np.arange(1, 11)
for i in arr:
print(i) #1 2 3 4 5 6 7 8 9 10
for i in range(1,11):
print(i) #1 2 3 4 5 6 7 8 9 10
2-4 정렬(sort)
arr = np.array([1,10,5,8,3,9,7,2,4,6])
#기본적으로 오름차순 정렬
np.sort(arr) #array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
#내림차순 정렬은 -1값을 설정, 값이 유지되지 않음
np.sort(arr)[::-1] #array([10, 9, 8, 7, 6, 5, 4, 3, 2, 1])
np.sort(arr) #array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
arr #array([ 1, 10, 5, 8, 3, 9, 7, 2, 4, 6])
result=np.sort(arr)
result #array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
•N차원 정렬
arr2d = np.array([[11,10,12,9],
[3,1,4,2],
[5,6,7,8]])
arr2d.shape #(3,4)
#열 정렬(왼쪽에서 오른쪽으로)
np.sort(arr2d, axis=1)
#array([[ 9, 10, 11, 12],
# [ 1, 2, 3, 4],
# [ 5, 6, 7, 8]])
#행 정렬(위에서 아래로)
np.sort(arr2d, axis=0)
#array([[ 3, 1, 4, 2],
# [ 5, 6, 7, 8],
# [11, 10, 12, 9]])
#index를 반환하는 argsort
arr2d = np.array([[5,6,7,8],
[3,1,4,2],
[11,10,12,9]])
np.argsort(arr2d, axis=0)
#array([[1, 1, 1, 1],
# [0, 0, 0, 0],
# [2, 2, 2, 2]])
arr2d = np.array([[1,5,6,8],
[10,3,7,1],
[3,4,8,6]])
np.argsort(arr2d, axis=1)
#array([[0, 1, 2, 3],
# [3, 1, 2, 0],
# [0, 1, 3, 2]])
np.argsort(arr2d, axis=0)
#array([[0, 1, 0, 1],
# [2, 2, 1, 2],
# [1, 0, 2, 0]])
2-5 행렬-덧셈
#덧셈
import numpy as np
a=np.array([[1,2,3],
[2,3,4]])
b=np.array([[3,4,5],
[1,2,3]])
a+b #array([[4, 6, 8], [3, 5, 7]])
a=np.array([[1,2,3],
[2,3,4]])
b=np.array([[1,2],
[3,4],
[5,6]])
a+b
#sum
a=np.array([[1,2,3],
[2,3,4]])
np.sum(a, axis=0) #array([3, 5, 7])
np.sum(a, axis=1) #array([6, 9])
2-6 행렬-뺄셈
a=np.array([[1,2,3],
[2,3,4]])
b=np.array([[3,4,5],
[1,2,3]])
a-b #array([[-2, -2, -2], [ 1, 1, 1]])
a=np.array([[1,2,3],
[2,3,4]])
b=np.array([[1,2],
[3,4],
[5,6]])
a-b
2-7 행렬-곱셈
#일반 곱셈
a=np.array([[1,2,3],
[2,3,4]])
b=np.array([[3,4,5],
[1,2,3]])
print(a.shape) #(2,3)
print(b.shape) #(2,3)
a*b #array([[ 3, 8, 15], [ 2, 6, 12]])
a=np.array([[1,2,3],
[2,3,4]])
b=np.array([[1,2],
[3,4],
[5,6]])
a*b
단순 곱셈과 dot product는 다름
a=np.array([[1,2,3],
[2,3,4]])
b=np.array([[1,2],
[3,4],
[5,6]])
a.shape, b.shape #((3,3), (3,2))
np.dot(a,b) #array([[22, 28], [31, 40]])
3. Broadcastring
1-1 숫자의 연산(단일)
a = np.array([[1,2,3], [2,3,4]])
b = np.array([[3,3,3], [3,3,3]])
a+b #array([[4, 5, 6], [5, 6, 7]])
a-3 #array([[-2, -1, 0], [-1, 0, 1]])
a*3 #array([[ 3, 6, 9], [ 6, 9, 12]])
a/3 #array([[0.33333333, 0.66666667, 1. ], [0.66666667, 1. , 1.33333333]])
'파이썬' 카테고리의 다른 글
[자료구조] 시간복잡도 (0) | 2022.04.18 |
---|---|
[자료구조] 더블 링크드리스트 Dubly Linked List (0) | 2022.04.18 |
[자료구조] 링크드 리스트 Linked List (0) | 2022.04.18 |
[자료구조] 스택 stack (0) | 2022.04.17 |
[자료구조] 큐queue (0) | 2022.04.17 |