1. Numpy란
- 수학, 과학 계산용 패키지
- 성능: 파이썬 리스트보다 빠름.
- 메모리 사이즈 : 파이썬 리스트보다 적은 메모리를 사용.
- 빌트인 함수 : 선형대수, 통계관련 여러 함수들을 내장. (파이썬에는 X)
1-1. Numpy 배열
- 1차원 배열 : numpy.array([data1, data2...])
- 2차원 배열 : numpy.array([data1, data2...], [data3, data4...])
# 별칭(alias) 지정하기
import numpy as np
# ndarray(넘파이 배열) 생성
arr = np.array([1,2,3,4]) # arr는 참조변수. (메모리를 참조하고 있는 변수)
type(arr) # numpy.ndarray 출력, ndarray 객체 타입이기 때문.
* 참조 변수란?
arr = np.array([1,2,3,4])를 실행하고 나면,
- array[1,2,3,4]는 heap 영역에 차지. heap영역에서 배열이 위치한 주소가 stack에 저장되는 것!
- stack에는 변수 메모리가 차지. 그곳에는 heap의 주소를 참조함. ex)1000
# list로부터 ndarray 생성하기
# list 생성
list1 = [1,2,3,4]
list2 = [[1,2,3,4],[5,6,7,8]]
# ndarray 생성
arr1 = np.array(list1)
arr2 = np.array(list2)
# 배열의 크기를 알려주는 메서드 shape
arr1.shape # (4,) # 4열
arr2.shape # (2, 4) # 2행 4열
1-2. array에서 data 타입
- array에서는 1개의 단일 데이터 타입만 허용됨. (list와 다르게)
list1 = [1, 3.14, '김사과', '1234']
print(list1) # [1, 3.14, '김사과', '1234'] 출력, list는 가능.
arr = np.array([1, 2, 3.14])
print(arr) # [1. 2. 3.14]
# np.array는 가장 큰 데이터형으로 맞춰지기 때문에, arr의 모든 데이터가 float타입으로 변경.
# 작은 데이터 형으로 맞추는 방법 'dtype' ex) int와 float 타입이 혼재되어있을 경우, int로 맞추는 방법.
arr = np.array([1, 2, 3, 3.14], dtype=int)
print(arr) # [1 2 3 3] 출력
# int와 str 타입이 혼재되어 있는 경우, str타입으로 변경됨.
arr = np.array([1, 3.14, '김사과', '1234'])
print(arr) # ['1' '3.14' '김사과' '1234'] 출력
print(arr[0]+arr[1]) # 13.14 출력
arr = np.array([1, 3.14, '1234'], dtype=int)
print(arr) # [1 3 1234]
# 단, '김사과'를 넣을 경우, Error발생. str을 int형으로 바꿀 수 없기 때문.
1-3. 슬라이싱(Slicing)
- index로 배열에 접근하는 방법
# 1차원 array
arr = np.array([0, 1, 2, 3, 4, 5, 6 7, 8, 9])
print(arr.shape) # (10, ) 출력
# index를 지정하여 색인
print(arr[5]) # 5 출력
print(arr[-1]) # 배열 마지막 원소인 9 출력
# 2차원 array
arr2d = np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
print(arr2d.shape) # (3,4) 출력
print(arr2d[0,2]) # 3 출력
print(arr2d[2,1]) # 10 출력
# 범위 색인 1차원
# 1차원
print(arr) # [0 1 2 3 4 5 6 7 8 9]
# 1부터 끝까지
print(arr[1:]) # [1 2 3 4 5 6 7 8 9]
# index 5 미만
print(arr[:5]) # [0 1 2 3 4]
# index 1 이상 5 미만
print(arr[1:5]) # [1 2 3 4]
# 마지막 데이터를 제외
print(arr[:-1]) # [0 1 2 3 4 5 6 7 8]
# 범위 색인 2차원
print(arr2d) # [[1 2 3 4]
# [5 6 7 8]
# [9 10 11 12]]
# 0행의 데이터를 모두 가져올 경우
print(arr2d[0,:]) # [1 2 3 4]
# 2열의 데이터를 모두 가져올 경우
print(arr2d[:, 2]) # [3 7 11]
# 0행, 1행의 데이터를 모두 가져올 경우
print(arr2d[:2, :]) # [[1 2 3 4] [5 6 7 8]]
# 0행 1행의 데이터 중 2열 이상의 데이터를 가져올 경우
print(arr2d[:2, 2:]) # [[3 4][7 8]]
# Fancy 인덱싱 : 범위가 아닌,특정 index의 집합의 값을 선택하여 추출하고 싶을 때 사용하는 색인.
arr = np.array([10, 23, 2, 7, 90, 65, 32, 66, 70])
idx = [1, 3, 5]
print(arr[idx]) # [23 7 65] 출력
print(arr2d[[0, 1], :]) # [[12 3 4][5 6 7 8]], 0,1행 전체 열
print(arr2d[:, [1, 2, 3]]) # [[2 3 4][6 7 8][10 11 12]] 출력, 전체 행에서 index 1, 2, 3 값만 추출
# Boolean 인덱싱 : 조건 필터링을 통하여 Boolean 값을 이용한 색인.
arr = np.array([1, 2, 3, 4, 5, 6, 7])
arr2d = np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
TrueFalse = [True, False, True] # Error 발생! 길이를 맞추지 않았기 때문.
TrueFalse = [True, False, True, True, False, True, False]
print(arr[TrueFalse]) # [1 3 4 6] 출력, index가 True인 값만 추출(0 외에는 True이므로 모두 추출)
# 조건 필터 : 결과값이 무조건 boolean형으로 나오는 것을 이용.
# 조건 필터는 결과값으로 boolean형(True, False)를 반환하기 때문에 boolean형 배열이 출력됨.
print(arr2d > 2) # [[False True True True] [True True True True][True True True True]]
print(arr2d[arr2d > 2]) # 2보다 클경우, True일 경우, 출력. 1차원 배열로 출력됨.
# [3 4 5 6 7 8 9 10 11 12]
print(arr2d[arr2d < 5]) # 5보다 작을 경우, True일 경우, 출력.
# [1 2 3 4]
# arange 메서드
- [start, stop, 간격]을 지정해서 배열을 생성하는 메서드
import numpy as np
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
arr = np.arange(start=1, stop=11)
print(arr) # [ 1 2 3 4 5 6 7 8 9 10] 출력
# 아래 반복문과 같은 결과 값
for i in arr:
print(i) # 1 2 3 4 5 6 7 8 9 10 출력
# 1~10 사이의 값 중 홀수만 생성
arr = np.arange(1, 11, 2)
print(arr) # [1 3 5 7 9] 출력
# np.ones / np.zeros
- 1 / 0 으로 초기화된 배열을 생성하는 메서드
print(np.ones((4,5)) # (4행 5열)을 1로 채운 배열. 소수점으로 생성됨.
# 아래와 같이 출력
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
print(np.zeros((2, 3, 4))) # 3행 4열 2매트릭스, 순서: (매트릭스, 행, 열)
# 아래와 같이 출력
[[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]]
# np.full
- 지정한 수로 배열 값을 이루는는 메서드
import numpy as np
np.full((3, 4, 2), 7) # 7로 채워진, 3 매트릭스 4행 2열 배열 생성하기.
# 아래와 같이 출력
array([[[7, 7],
[7, 7],
[7, 7],
[7, 7]],
[[7, 7],
[7, 7],
[7, 7],
[7, 7]],
[[7, 7],
[7, 7],
[7, 7],
[7, 7]]])
# np.linspace
- 주어지는 숫자로 해당 범위를 (소수점단위로) 나눠 배열을 생성하기
ex) 1~10까지의 범위를 주어진 숫자 '3'으로 나눈다면, [1. 5.5 10.] 배열 생성.
print(np.linspace(1, 10, 3)) # 1부터 10까지의 범위를 3등분으로 나눈 배열 생성.
# [ 1. 5.5 10. ] 출력
print(np.linspace(1, 10, 4)) # 1부터 10까지의 범위를 4등분으로 나눈 배열 생성.
# [ 1. 4. 7. 10.] 출력
print(np.linspace(1,10)) # 1부터 10까지의 범위를 50(default)등분으로 나눈 배열 생성.
# [ 1. 1.18367347 1.36734694 1.55102041 1.73469388 1.91836735
# 2.10204082 2.28571429 2.46938776 2.65306122 2.83673469 3.02040816
# 3.20408163 3.3877551 3.57142857 3.75510204 3.93877551 4.12244898
# 4.30612245 4.48979592 4.67346939 4.85714286 5.04081633 5.2244898
# 5.40816327 5.59183673 5.7755102 5.95918367 6.14285714 6.32653061
# 6.51020408 6.69387755 6.87755102 7.06122449 7.24489796 7.42857143
# 7.6122449 7.79591837 7.97959184 8.16326531 8.34693878 8.53061224
# 8.71428571 8.89795918 9.08163265 9.26530612 9.44897959 9.63265306
# 9.81632653 10. ] 출력
# np.reshape
- ndarray 배열의 형태, 차원을 바꾸기위해 사용하는 메서드
- 변경하려는 형태가 배열 개수와 일치하지 않으면 Error 발생!
import numpy as np
x = np.array(1,16) # 1~15까지의 배열 생성
print(np.shape) # (15, ) 출력
# 3행 5열로 변경
print(x.reshape(3,5))
# 아래와 같이 출력
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]]
# 5행 3열로 변경
print(x.reshape(5,3))
# 아래와 같이 출력
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]
[13 14 15]]
# np.random.rand
- 학습을 위해 데이터를 추출하기 위해 랜덤 메서드를 사용!
- np의 서브 모듈 random 함수를 통해 ndarray 생성하기
- 0~1 사이의 분포로 랜덤하게 ndarray 생성하는 메서드
# 랜덤으로 4매트릭스 5행 3열 배열 생성
np.random.rand(4, 5, 3)
# 아래와 같이 출력
array([[[0.95665741, 0.64599569, 0.68856664],
[0.24260471, 0.52134367, 0.68840639],
[0.26398435, 0.25640419, 0.79105431],
[0.31842876, 0.0370681 , 0.5108908 ],
[0.55130947, 0.83901902, 0.95445558]],
[[0.69988978, 0.96258713, 0.61796988],
[0.5382594 , 0.87474674, 0.04953501],
[0.74056584, 0.83445871, 0.18046203],
[0.50357 , 0.63097654, 0.75146364],
[0.06199008, 0.69265192, 0.65802972]],
[[0.07143774, 0.70317232, 0.64361461],
[0.22898771, 0.0026465 , 0.44101303],
[0.29247581, 0.71238853, 0.32137538],
[0.63861468, 0.42064512, 0.04718208],
[0.64559778, 0.69147657, 0.30079824]],
[[0.81831065, 0.25194602, 0.47228828],
[0.09971325, 0.71863146, 0.21315332],
[0.45948438, 0.49534062, 0.64608627],
[0.05253736, 0.0520116 , 0.2389425 ],
[0.47250635, 0.30282647, 0.66613261]]])
# np.random.randn
- 'randn'에서 'n' -> normal distribution(정규분포)
- 정규분포로 랜덤하게 추출하여 ndarray 생성하는 메서드
- 음수도 추출.
print(np.random.randn(5)) # 1차원 배열 생성
# 다음과같이 출력
[-0.49919015 -2.01353312 0.16350229 -0.94190703 -0.67841746]
print(np.random.randn(4, 5, 3)) # 4매트릭스 5행 3열 배열 생성
# 다음과 같이 출력
[[[-0.82527008 0.48874833 0.44524156]
[ 0.60349624 0.36971818 0.87574234]
[-1.33933077 1.73230921 -0.11572752]
[-0.9655673 0.75065458 1.12626515]
[ 1.19254333 0.08517315 -1.16915301]]
[[ 0.48232945 -0.27682146 1.0418247 ]
[-0.95468666 0.92240586 0.26507384]
[-1.62702642 -1.04364959 2.01437408]
[ 0.61341916 0.06339334 1.61140619]
[ 0.04098564 -0.11962246 -0.34544803]]
[[ 1.44642662 -0.2023626 0.14471633]
[-0.48157258 -0.74574389 0.28297891]
[-0.19067284 -0.11622095 -0.90086237]
[ 0.07432894 0.26758786 -0.45018629]
[ 0.7871529 -2.31750761 1.25245331]]
[[ 1.31726455 0.02208279 -0.08967373]
[ 1.1395287 -0.16853244 -0.83967144]
[-0.60661417 -0.45248888 -0.09155771]
[ 0.72076107 1.61239246 -0.04128506]
[ 0.40019919 -1.60663215 -0.22394449]]]
# randint()
- 특정 정수 사이에서 랜덤하게 추출하여 배열을 생성하는 메서드
print(np.random.randint(1, 100, size=(5, ))) # [26 25 70 36 50]
# 2차원 (5행 2열 int형 추출)
print(np.random.randint(1, 100, size=(5,2)))
# 다음과 같이 출력
[[91 31]
[12 3]
[62 1]
[74 28]
[80 76]]
# 3차원(2매트릭스, 3행, 4열 int형 추출)
print(np.random.randint(1, 100, size=(2,3,4)))
# 다음과 같이 출력
[[[58 36 2 28]
[79 60 71 78]
[68 34 62 12]]
[[20 43 30 38]
[15 34 29 81]
[35 39 77 70]]]
# np.random.seed
- 랜덤한 값을 동일하게 다시 생성하고자 할 때 사용.
- seed() 괄호 안에는 아무 숫자나 넣어도 됨. 각 랜덤 값들에 대한 identity라 생각하기.
- 데이터를 랜덤으로 학습시켜야할 때 그 랜덤값을 고정시키기 위해 쓰임.
np.random.seed(10)
print(np.random.randn(3,4))
# 다음과 같이 출력
[[ 1.3315865 0.71527897 -1.54540029 -0.00838385]
[ 0.62133597 -0.72008556 0.26551159 0.10854853]
[ 0.00429143 -0.17460021 0.43302619 1.20303737]]
np.random.seed(10)
print(np.random.randn(3,4))
# seed=10 동일한 값이기 때문에 다음과 같이 출력
[[ 1.3315865 0.71527897 -1.54540029 -0.00838385]
[ 0.62133597 -0.72008556 0.26551159 0.10854853]
[ 0.00429143 -0.17460021 0.43302619 1.20303737]]
# np.random.choice
- 주어진 1차원 ndarray로부터 랜덤하게 추출하는 메서드
- 배열 대신 정수가 주어진 경우, np.arange(해당 숫자)로 간주하여 0부터 해당숫자까지 중 랜덤으로 샘플링.
x = np.array([1, 2, 3, 1.5, 2.6, 4.9])
print(np.random.choice(x, size=(2,2)))
# 다음과 같이 출력. 중복 허용.
[[2.6 1. ]
[2.6 3. ]]
print(np.random.choice(x, size=(2,2), replace=False))
# 다음과 같이 출력. 중복 불가.
[[1.5 3. ]
[2.6 4.9]]
print(np.random.choice(100, size=(3,4))) # 0 ~ 100 사이의 정수 샘플링
# 다음과 같이 출력. 중복 허용.
[[56 18 84 74]
[43 8 33 86]
[43 19 85 49]]
print(np.random.choice(100, size=(2,3,4), replace=False))
# 다음과 같이 출력. 중복 불가.
[[[91 98 25 26]
[59 23 8 97]
[58 82 80 12]]
[[30 87 18 43]
[99 83 35 2]
[52 84 3 16]]]
# ndarray shape 변경하기 - ravel()
- 다차원 배열을 1차원 배열로 변경
- 원본 데이터를 변형. (차원 변형은 없지만, 데이터는 바뀔 수 있음.)
why? 참조변수 temp도 x와 같은 데이터 공간을 가리키기 때문.
# np.arange(15)는 0부터 14까지의 배열.
x = np.arange(15).reshape(3,5)
print(x)
# 다음과 같이 출력
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
print(np.ravel(x)) # row(행) 우선 , [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
print(np.ravel(x, orderer='F')) # orderer를 False -> field 우선
print(x) # 결과는 바뀌지 않음. -> ravel()은 원본의 차원에는 영향을 미치지 않음.
temp = x.ravel() # row 우선으로 1차원 배열 , [ 0 5 10 1 6 11 2 7 12 3 8 13 4 9 14]
temp[0] = 100 # 참조변수가 같은 데이터 공간을 가리키기 때문에 원본도 함께 변경.
print(temp) # [100 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
print(x) # 여전히 1차원 배열이지만, x[0]은 100으로 변함. (원본 데이터 변형)
# flatten()
- 다차원배열을 1차원 배열로 변경
- copy를 생성하여 변경함. (원본이 변하지 않음.)
y = np.arange(15).reshape(3,5) # 0~14까지의 3행 5열 배열
# print(y)는 다음과 같이 출력
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
temp2 = y.flatten(order='F') # field순 1차원배열로 변경. 이건 copy본.
print(temp2) # [ 0 5 10 1 6 11 2 7 12 3 8 13 4 9 14]
temp2[0]=100
print(temp2) # 변형, [100 5 10 1 6 11 2 7 12 3 8 13 4 9 14]
print(y) # 원본은 변형되지 않음.
# 다음과 같이 출력
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
1-4. 정렬(Sort)
# 1차원 정렬
import numpy as np
arr = np.array([1, 10, 5, 8, 2, 4, 3, 6, 8, 7, 9])
# default는 오름차순 정렬
print(np.sort(arr)) # [ 1 2 3 4 5 6 7 8 9 10] 출력
# 내림차순 정렬 : 옵션에 -1 값
print(np.sort(arr)[::-1]) # [10 9 8 8 7 6 5 4 3 2 1] 출력
print(arr) # 원본이 변경된 것은 아님.
# 만약 sort된 배열을 저자하려면 다른 배열에 저장해야함.
arr2 = np.sort(arr)
print(arr2) # [ 1 2 3 4 5 6 7 8 8 9 10] 출력
# N차원 정렬
- axis : 차수를 나타내는 기준
- 행 데이터를 가리킬 때는 axis=0 -> 행 정렬 (위에서 아래로)
- 열 데이터를 가리킬 때는 axis=1 -> 열 정렬 (왼쪽에서 오른쪽으로)
- 매트릭스 데이터를 가리킬 때는 axis=2
arr2d = np.array([[5,6,7,8],[4,3,2,1],[10,9,12,11]])
print(arr2d, arr2d.shape)
# 다음과 같이 출력. 3행 4열
[[ 5 6 7 8]
[ 4 3 2 1]
[10 9 12 11]] (3, 4)
print(np.sort(arr2d, axis=1)) # axis=1 ; 각 행 내에서 정렬(열 정렬)
# 다음과 같이 출력
[[ 5 6 7 8]
[ 1 2 3 4]
[ 9 10 11 12]]
print(np.sort(arr2d, axis=0)) # axis=0 ; 각 행끼리 정렬(행 정렬)
# 다음과 같이 출력
[[ 4 3 2 1]
[ 5 6 7 8]
[10 9 12 11]]
# np.argsort
- index를 반환하는 메서드 (정렬된 값을 반환하는게 아닌, 정렬된 index를 반환)
- 원본 변형X
arr2d = np.array([[5,6,7,8], # [5,6,7,8]이 0, [4,3,2,1]이 1, [10,9,12,11]이 2
[4,3,2,1],
[10,9,12,11]])
print(np.argsort(arr2d, axis=0)) # 행 정렬하고나서는 arr2d[1]-arr2d[0]-arr2d[2] 순으로 변경.
[[1 1 1 1]
[0 0 0 0]
[2 2 2 2]] # 원본엔 변형 없음.
1-5. 행렬의 계산
# 덧셈, 뺄셈, 곱셈
- 행렬끼리의 덧셈, 뺄셈, 곱셈 계산
a=np.array([[1,2,3],[4,5,6]])
b=np.array([[3,4,5], [1,2,3]])
# 덧셈
print(a+b)
# 출력
[[4 6 8]
[5 7 9]]
# 뺄셈
print(a-b)
# 출력
[[-2 -2 -2]
[ 3 3 3]]
# 곱셈
print(a*b)
# 출력
[[ 3 8 15]
[ 4 10 18]]
# 스칼라 곱셈도 가능함.
print(2*a)
# 출력
[[ 2 4 6]
[ 8 10 12]]
# 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 # (3, 3) 출력
b.shape # (3, 2) 출력
# 첫번째 배열의 열과 두번째 배열의 행이 같은 길이기 때문에 곱셈 가능.
# np.dot 메서드로 곱셈 가능.
np.dot(a,b)
# 출력
array([[22, 28],
[22, 28],
[31, 40]])
a.dot(b) # 위와 같은 결과를 얻을 수 있음.
print(1*1+2*3+3*5) # 22로, a의 첫번째 행과 b의 첫번째 열을 곱하는 수식이다.
1-5. Broadcasting
- 두 배열이 동일한 길이인 경우
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 = np.array([[1,2,3], [2,3,4]])
print(a+3)
print(a-3)
print(a*3)
print(a/3)
'Python' 카테고리의 다른 글
[colab] 3. colab으로 pandas 모듈 사용하기(2) (0) | 2021.01.21 |
---|---|
[colab] 3. colab으로 pandas 모듈 사용하기(1) (0) | 2021.01.20 |
[colab] 1. 코랩 설치 및 기초 명령어 (0) | 2021.01.17 |
파이썬 기초 문법2 (함수와 람다 표현식, 라이브러리) (0) | 2021.01.02 |
파이썬 기초 문법2 (기본 입출력과 반복문&조건문) (0) | 2021.01.02 |