<9-1주차 수강 클립>
03. 데이터 처리를 위한 Python (Numpy)
04. ndarray 인덱싱 & 슬라이싱 이해하기
05. ndarray 데이터 형태를 바꿔보기(reshape, flatten 등 함수 이용)
06. ndarray 기본 함수 사용하기
이번 시간에는 ndarray를 생성한 뒤, 인덱싱과 슬라이싱으로
원소들에 접근하는 법을 배웠습니다.
이어서 ndarray에서 사용할 수 있는 여러 함수들에 대해서도 배워보는 시간이었네요!
>>수강 인증샷<<
04. ndarray 인덱싱 & 슬라이싱 이해하기
- 인덱싱
파이썬 리스트와 동일한 개념으로 사용됨
차원이 여러개일 때 ','를 사용하여 각 차원의 인덱스에 접근 가능
음수 인덱싱 지원 (뒤에서부터 인덱싱)
x = np.arange(10)
x[9]
x[-1]
x[3] = 100 #값 변경 가능
: 1차원 벡터 인덱싱
x = np.arange(10).reshape(2, 5)
x[0] #0번째 행 (1차원 벡터)
x[0, 2] #0행 2열의 원소
x[1, -1] #1행 -1열(=4열)의 원소
: 2차원 행렬 인덱싱
x = np.arange(36).reshape(3, 4, 3) #4행 3열 행렬이 3개
x[0] #3차원->2차원(행렬) 한 차원 축소
x[1, 2] #1번째 2차원 행렬에서 2번째 행(벡터)
x[1, 2, 1] #원소 하나
: 3차원 텐서 인덱싱
- 슬라이싱
리스트, 문자열 slicing과 동일한 개념으로 사용됨
','을 사용하여 각 차원 별로 슬라이싱 가능
단순히 자르는 것이기 때문에 차원이 줄어들지 않음!
x = np.arange(10)
x[1:7] #[1, 6)까지의 원소 슬라이싱
: 1차원 벡터 슬라이싱
x = np.arange(10).reshape(2, 5)
x[:, 1:4] #',' 기준 행/열 슬라이싱 범위 각각 따로 설정
#슬라이싱+인덱싱 함께 사용
x[0, :2] #차원이 하나 줄어듦! (2차원 행렬->1차원 벡터로)
#슬라이싱만
x[:1, :2] #위와 동일한 원소만, but 차원은 그대로
x[0:1, 0:2] #0은 생략 가능 (생략하면 '처음부터')
: 2차원 행렬 슬라이싱
x = np.arange(54).reshape(2, 9, 3)
x[:1, :2, :]
#슬라이싱+인덱싱
x[0, :2, :] #차원이 하나 줄어듦 (3차원 텐서->2차원 행렬)
: 3차원 텐서 슬라이싱
05. ndarray 데이터 형태를 바꿔보기(reshape, flatten 등 함수 이용)
- ravel, np.ravel
다차원 배열을 1차원으로 변경 (1차원으로 쭉 편다 생각!)
numpy 모듈의 함수, ndarray의 메소드로도 존재
'order' 파라미터
1. C: row 우선 변경 (default 값)
2. F: column 우선 변경
x = np.arange(15).reshape(3, 5)
np.ravel(x)
x.ravel()
: ravel 함수 사용
temp[0] = 100
print(temp)
print(x)
: ravel 함수는 내부 데이터를 그대로 유지 (복사본을 만들지 x) 하기 떄문에 ndarray가 가지고 있는 값을 그대로 유지함
: temp[0] 값을 수정함과 동시에 x[0, 0]의 값도 수정됨
x = np.arange(15).reshape(3, 5)
np.ravel(x, order='F')
: order='F'로 변경, 열 기준으로 펼침
06. ndarray 기본 함수 사용하기
- flatten
다차원 배열을 1차원으로 변경
ravel과의 차이점: copy를 생성하여 변경함(즉 원본 데이터가 아닌 복사본을 반환)
'order' 파라미터 (default: order='C')
1. 'C' - row 우선 변경 (default 값)
2. 'F' - column 우선 변경
y = np.arange(15).reshape(3, 5)
temp2 = y.flatten() #ndarray의 메소드로만 존재
temp2[0] = 100
print(temp2)
print(y)
: 복사본을 반환하기 때문에 원본 데이터 x[0, 0]은 바뀌지 않음
y = np.arange(15).reshape(3, 5)
y.flatten(order='F')
: order='F'로 변경, 열 기준으로 펼침
- reshape 함수
array의 shape을 다른 차원으로 변경
*) reshape 한 후의 결과의 전체 원소 개수가 이전 원소 개수와 같아야 가능
ex) 이미지 데이터 벡터화: 이미지는 기본적으로 2차원 혹은 3차원(RGB)이나, 트레이닝을 위해 1차원으로 변경하여 사용됨
x = np.arange(36)
print(x)
print(x.shape) #(36, )
print(x.ndim) #number of dimension (차원), 1
y = x.reshape(6, 6) #원래의 크기가 같도록 row*col 설정
print(y.shape) #(6, 6)
print(y.ndim) #2
x.reshape(6, -1)
: 행이 주어졌다면 열은 자동으로 정해짐 (계산이 곤란한 경우 사용)
k = x.reshape(3, 3, 4) #x.reshape(3, -1, 4) 역시 남은 하나의 값은 -1로 둘 수 있음
print(k)
print(k.shape) #(3, 3, 4)
print(k.ndim) #3
06. ndarray 기본 함수 사용하기
- numpy documentation
numpy에서 제공되는 함수 등에 대한 문서
- 연산함수
add, subtract, multiply, divide
기본 전제: shape이 같은 ndarray끼리 연산 가능
*) 사칙연산의 경우 함수보다는 연산자(+, - *, /)를 더 주로 이용
같은 위치(=인덱스가 같은)의 원소끼리 연산
x = np.arange(15).reshape(3, 5)
y = np.random.rand(15).reshape(3, 5)
np.add(x, y) # x + y
np.subtract(x, y) # x - y
np.multiply(x, y) # x * y
np.divide(x, y) # x / y
- 통계함수
평균, 분산, 중앙, 최대, 최소값 등등 통계 관련 함수
np.mean(y)
y.mean() #메소드가 없는 경우가 더 많음 (np안에 있을 가능성이 더 높다)
np.max(y)
#최댓값의 인덱스
#flatten한 상태라 가정하고 인덱스를 반환함 (1차원 벡터로 생각)
np.argmax(y)
np.var(y)
np.median(y)
np.std(y)
- 집계함수
합계(sum), 누적합계(cumsum_cumulated sum) 등등 계산 가능
np.sum(y)
#list로 반환: 2번째 원소=바로 앞 원소의 값 + 자기자신의 값 ...(누적됨)
#그래프 그릴 때 유용
np.cumsum(y)
#axis(축)=None
#numpy 함수 중 axis를 파라미터로 갖는 함수들은 축을 기준으로 연산 가능
np.sum(y, axis=1)
- any, all 함수
any: 특정 조건을 만족하는 원소가 하나라도 있으면 True, 아니면 False
all: 모든 원소가 특정 조건을 만족한다면 True, 아니면 False
z = np.random.randn(10)
z>0
: ndarray의 각 원소를 조건과 비교, boolean으로 구성된 검사 결과 array를 반환
np.any(z>0)
np.all(z>0)
np.all(z!=0)
- where 함수
조건에 따라 선별적으로 값을 선택 가능
ex) 음수인 경우는 0, 나머지는 그대로 값을 쓰는 경우
z = np.random.randn(10)
#np.where(조건, 참일 경우 값, 거짓일 경우 값)
np.where(z > 0, z, 0)
강의 링크: https://bit.ly/3cB3C8y
'코딩 > 머신러닝&데이터 분석 강의' 카테고리의 다른 글
[머신러닝 인강] 10-1주차: linalg 서브모듈, 그래프 표현 (0) | 2021.04.24 |
---|---|
[머신러닝 인강] 9-2주차: ndarray 축(axis), 브로트캐스팅(broadcasting), 불린 인덱싱(boolean indexing) (0) | 2021.04.18 |
[머신러닝 인강] 8-2주차: numpy 모듈과 ndarray 이해하기 (0) | 2021.04.10 |
[머신러닝 인강] 8-1주차: selenium 모듈 (0) | 2021.04.07 |
[머신러닝 인강] 7-2주차: beautifulsoup 모듈 (0) | 2021.04.02 |