* 위 강의노트는 패스트캠퍼스에서 주관하는 강의를 수강하고 작성한 노트입니다.
1. numpy 모듈 & ndarray 이해하기
- nunpy를 사용하는 이유
- 성능 : 파이썬 리스트보다 빠름
- 메모리 사이즈 : 파이썬 리스트보다 적은 메모리 사용
- 빌트인 함수 : 선형대수, 통계관련 여러 함수 내장
- ndarray란?
- numpy에서 사용되는 다차원 리스트를 표현할 때 사용되는 데티어 타입
<캡쳐.png 사용>
numpy모듈 함수 이용하여 ndarrary 데이터 생성하기
# numpy package import
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1, 2, 3]) ## ndarray 생성
y = np.array([2, 4, 6])
- np.array로 함수 생성하기
x = np.arrary([1, 2, 3, 4]) # 1차원 array생성
print(x)
y = np.array([2, 3, 4], [1, 2, 5]) # 다차원array 생성
print(type(y)) # 타입 확인
[1 2 3 4 ]
[[2 3 4]
[1 2 5]]
np.arange(10) # 0부터 10미만까지 출력
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.arange(1, 10) # 1부터 10 미만까지 출력
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
np.arange(1, 10, 2) # 1부터 10 미만까지 2씩 건너뛰어서 출력
array([1, 3, 5, 7, 9])
- np.ones, np.zeros로 생성하기
np.ones
: 모든 원소가 1인 행렬 만들기np.zeros
: 모든 원소가 0인 행렬 만들기
np.ones((4, 5)) # 모든 원속 1인 4행 5열
array([[1. , 1., 1., 1., 1.],
[1. , 1., 1., 1., 1.],
[1. , 1., 1., 1., 1.],
[1. , 1., 1., 1., 1.]])
np.zeros((2, 3, 4)) # 모든 원속 0인 3차원 행렬
array([[[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.empty, np.full로 생성하기
np.empty
: 초기화된 값을 새엉np.full
: 하나의 숫자로 채워진 행렬을 생성
np.empty(2, 3) # random한 숫자로 초기화
arrary([1232131, 1223432423, 2353523],
[25323.534, 2534525, 23523552])
np.full((3, 4), 7)
array([[7, 7, 7, 7],
[7, 7, 7, 7],
[7, 7, 7, 7]])
- np.eye로 생성하기
- 단위 행렬 생성
np.eye(3) # 행과 열의 길이가 같아야 해서 하나의 값만 받음
array([[1., 0., 0, ],
[0., 1., 0, ],
[0., 0., 1.]])
- np.linspace로 생성하기
- 숫자 사이의 간격이 모두 동일하게 나누는 수
np.linspace(1, 10, 3) # 처음, 끝, 나누고자 하는 수
array([1, 5.5, 10])
- reshape 함수 활용
- ndarray의 형태, 차원을 바꾸기 위해 사용
x = np.arange(1, 16)
print(x)
x.shape # 현재 x의 상태는 길이 15
[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
(15, )
x.reshape(3 ,5) # x를 3행 5열로 바꾸기
array([[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15]])
random 서브모듈 함수 이용하기
- rand 함수
- 0, 1 사이의 분포로 랜덤한 ndarray 생성
np.random.rand(2, 3) # 2행 3열의 무작위 수 출력
array([[0.95230979, 0.53646642, 0.06261263],
[0.72885464, 0.30390009, 0.85691438]])
- randn 함수
- n : normal distribution(정규분포)
- 정규분포로 샘플링된 랜덤 ndarray 생성
np.random.rand(2, 3) # 2행 3열의 정규분포 랜덤숫자 출력
array([[-0.10813, 1.01265, -0.09823],
[0.456234, 0.00234, 0.23451]])
- randint 함수
- 특정 정수 사이에서 랜덤하게 샘플링
np.random.randint(1, 100, size = (3, 5)) # 1에서 100 사이의 정수를 3행 5열로 random하게 추출
array([[47, 67, 59, 67, 40],
[58, 20, 19, 5 , 44],
[91, 43, 55, 80, 8]])
- seed 함수
- 랜덤한 값을 동일하게 다시 생성하고자 할 때 사용
np.random.seed(100) # seed값을 줌으로 랜덤한 값 고정
np.random.randn(2, 3)
array([[-0.10813, 1.01265, -0.09823],
[0.456234, 0.00234, 0.23451]])
- choice
- 주어진 1차원 ndarray로부터 랜덤으로 샘플링
- 정수가 주어진 경우, np.arange(해당숫자)로 간주
np.random.choice(100, size = (2, 3)) # 100 이하의 정수 중에 2행 3열 출력
array([[79, 80, 62],
[20, 15, 36]])
x = np.array([1, 2, 4, 1.5, 2.6, 4.9])
np.random.choice(x, size = (2, 2), replace = True) # x리스트중에 숫자를 뽑아 2행 2열 생성(중복허용)
array([[1.5, 2.6],
[1, 2.6]])
- 확률분포에 따른 ndarray 생성
- uniform
- normal
- etc.
np.random.uniform(1, 3, size = 2,2)
array([[1.34, 1.58],
[1.22, 2.99]])
indexing과 slicing 이해하기
-
인덱싱
- 파이썬 리스트와 동일한 개념으로 사용
- , 를 사용하여 각 차원의 인덱스에 접근 가능
-
1차원 벡터 인덱싱
x = np.arange(10)
print(x)
[0 1 2 3 4 5 6 7 8 9]
x[3] = 100 # 3번째 자리를 100으로 바꾸기
print(x)
[0 1 100 3 4 5 6 7 8 9]
- 2차원 행렬 인덱싱
x = np.arange(10).reshape(2, 5)
print(x)
[[0 1 2 3 4]
[5 6 7 8 9]]
x[1] # 첫번째 행을 출력
[5 6 7 8 9]
x[1, 2] # 첫번째 행의 두번째 열을 가져오기
7
-
슬라이싱
- 리스트, 문자열, slicing과 동일한 개념으로 사용
- , 를 사용하여 각 차원 별로 슬라이싱 가능
-
1차원 벡터 슬라이싱
x = np.arange(10)
print(x)
[0 1 2 3 4 5 6 7 8 9]
x[1:7] # 첫번째부터 7번째까지 슬라이싱
array([1 2 3 4 5 6])
- 2차원 벡터 슬라이싱
x = np.arange(10).reshape(2, 5)
print(x)
[[0 1 2 3 4]
[5 6 7 8 9]]
x[: , 1:4] # 행은 전부 가져오기, 열은 1에서 3열까지만 차원이 줄지는 않음!
array([[1 2 3],
[4 5 6]])
ndarray 데이터 형태를 바꿔보기
- ravel, np.ravel
- 다차원의 배열을 1차원으로 변경
- ‘order’ 파라미터
- ’C’ - row 우선 변경
- ‘F’ - column 우선 변경
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(x.ravel())
array([0 1 2 3 4 5 6 7 8 9 10 11 12 13 14])
print(np.ravel(x)) # x.ravel()과 동일
array([0 1 2 3 4 5 6 7 8 9 10 11 12 13 14])
- flatten
- 다차원 배열을 1차원으로 변경
- ravel과의 차이점 : copy를 생성하여 변경함(즉 원본 데이터가 아닌 복사본을 반환)
- ‘order’ 파라미터
- ’C’ - row 우선 변경
- ‘F’ - column 우선 변경
y = np.arange(15).reshape(3, 5)
print(y)
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
print(np.flatten(y, order = 'C')) # 행을 기준으로 펼쳐짐
array([0 1 2 3 4 5 6 7 8 9 10 11 12 13 14])
print(np.flatten(y, order = 'F')) # 열을 기준으로 펼쳐짐
array([0 5 10 1 6 11 2 7 12 3 8 13 4 9 14])
- reshape 함수
- array의 shape를 다른 차원으로 변경
- 주의할 점은 reshape한 후의 결과의 전체 원소 개수와 이전의 개수가 같아야 가능함
- 사용 예 : 이미지 데이터 벡터화 - 이미지는 기본적으로 2차원 혹은 3차원이나 트레이닝을 위해 1차원으로 변경하여 사용됨
x = np.arange(10)
print(x)
print(x.shape) # 1차원 길이 10
print(x.ndim) # 1차원
array([0 1 2 3 4 5 6 7 8 9])
(10, )
1
print(x.reshape(2, 5))
[[0 1 2 3 4],
[5 6 7 8 9]]
x.reshape(2, -1) # 하나의 값을 주면 나머지 값을 알아서 유추해서 reshape
[[0 1 2 3 4],
[5 6 7 8 9]]
ndarray 기본 함수 사용하기
x = np.arnage(15).reshape(3, 5)
y = np.arnage(15).reshape(3, 5)
print(x)
print(y)
[[ 0 1 2 3 4],
[ 5 6 7 8 9],
[10 11 12 13 14]][[ 0 1 2 3 4],
[ 5 6 7 8 9],
[10 11 12 13 14]]
- 연산함수
- add, substract, multiply, divide
- 기본적으로 차원과 행렬의 형태가 같아야 함
np.add(x, y) # 행렬 덧셈. 차원과 행렬이 같아야함.
[[ 0 2 4 6 8],
[10 12 14 16 18],
[20 24 28 32 36]]
np.subtract(x, y) # 행렬 뺄셈. 차원과 행렬이 같아야함.
[[ 0 0 0 0 0],
[ 0 0 0 0 0],
[ 0 0 0 0 0]]
np.multiply(x, y) # 행렬 원소끼리의 곱셈
[[ 0 1 4 9 16],
[ 25 36 49 64 81],
[100 121 144 169 275]]
np.divide(x, y) # 행렬 원소끼리의 나눗셈
[[ 1 1 1 1 1],
[ 1 1 1 1 1],
[ 1 1 1 1 1]]
- 통계 함수
- 평균, 분산, 중앙, 최대, 최소값 등등 통계 관련된 함수가 내장
np.mean(y) # y원소들의 평균값
y.mean() # np.mean(y)와 동일
np.max(y) # y의 최대값
np.argmax(y) # flatten한 형태라 가정하고 max값의 위치 출력
np.var(y) # 분산
np.median(y) # 중앙값
np.std(y) # 표준편차
- 집계함수
- 합계(sum), 누적합계(cumsum) 등등 계산 가능
np.sum(y) # y의 합
np.cumsum(y) # y 의 누적합
np.sum(y, axis = 0) # 축을 기준으로 sum
- any, all 함수
- any : 특정 조건을 만족하는 것이 하나라도 있으면 True, 아니면 False
- all : 모든 원소가 특정 조건을 만족한다면 True, 아니면 False
z = np.random.randn(10)
np.any(z > 0) # z의 원소들 중에 하나라도 0보다 크면 True, 아니면 False
np.all(z > 0) # 모든 원소가 0이면 True, 아니면 False
- where 함수
- 조건에 따라 선별적으로 값을 선택 가능
- 사용 예) 음수인경우는 0, 나머지는 그대로 값을 쓰는 경우
z = np.random.randn(10)
np.where(z > 0, z, 0) # z가 0보다 크면 z, 아니면 0으로 그대로 사용
axis(축) 이해 및 axis를 파라미터로 갖는 함수 활용하기
- axis 이해하기
- 몇몇 함수에는 axis keyword 파라미터가 존재
- axis 값이 없는 경우에는 전체 데이터에 대해 적용
- axis 값이 있는 경우에는, 해당 axis를 따라서 연산 적용
- axis를 파라미터로 갖는 함수를 이용하기
- 거의 대부분의 연산 함수들이 axis 파라미터를 사용
- 이 경우, 해당 값이 주어졌을 때, 해당 axis를 따라서 연산이 적용
- 따라서 결과는 해당 axis가 제외된 나머지 차원의 데이터만 남게 됨
- ex) np.sum, np.mean, …
x = np.arange(10)
print(x)
[ 0 1 2 3 4 5 6 7 8 9 ]
- 1차원 데이터에 적용하기
print(np.sum(x))
print(np.sum(x, axis = 0)) #1차원 벡터의 경우 차이가 없음
print(np.sum(x, axis = 1)) #차원이 1차원 미만이기 때문에 Error
45
45
- 2차원 데이터에 적용하기
y = x.reshape(2, 5)
print(np.sum(y))
print(np.sum(y, axis = 0)) # 행방향 sum
print(np.sum(y, axis = 1)) # 열방향 sum
45
[5, 7, 9, 11, 13]
[10, 35]
- 3차원 데이터에 적용하기
z = np.arange(36).reshape(3, 4, 3)
print(np.sum(y, axis = 0)) # 0번째 축이 없어지고 4행 3열만 남음
print(np.sum(y, axis = 1)) # 1번째 측이 없어지고 3행 3열이 남음
print(np.sum(y, axis = 2)) # 2번째 축이 없어지고 3행 4열이 남음
[[36, 39, 42],
[45, 48, 51],
[54, 57, 60],
[63, 66, 69]][[ 18, 22, 26],
[ 66, 70, 74],
[114, 118, 122]][[ 3, 12, 21, 30],
[ 39, 48, 57, 66],
[ 75, 84, 93, 102]]
- axis가 튜플인 경우
np.sum(z, axis = (0, 1)) # 0축과 1툭을 없앰, 2축만 남음
array([198, 210, 222])
'Study > ML_Basic' 카테고리의 다른 글
머신러닝과 데이터 분석 A-Z 올인원 패키지 - 데이터 분석을 위한 Python(Pandas) – (1) (0) | 2020.09.30 |
---|---|
머신러닝과 데이터 분석 A-Z 올인원 패키지 - 데이터 처리를 위한 Python(Numpy)(2) (0) | 2020.09.30 |
머신러닝과 데이터 분석 A-Z 올인원 패키지-데이터 수집을 위한 Python(2) (0) | 2020.09.10 |
머신러닝과 데이터 분석 A-Z 올인원 패키지 - 데이터 수집을 위한 Python(1) (0) | 2020.09.10 |
[수강 후기]머신러닝과 데이터분석 A-Z 올인원 패키지 - python programming 기초 (0) | 2020.09.08 |