티스토리 뷰
1️⃣ NumPy 소개
NumPy (Numerical Python)
Python에서 대규모 다차원 배열을 다룰 수 있게 도와주는 라이브러리
- Numpy 라이브러리는 효율적인 데이터분석이 가능하도록 N차원의 배열 객체를 지원한다.
- Numpy의 배열은 파이썬의 list()보다도 빠른 연산과 효율적인 메모리 사용이 가능하기 때문에 빅데이터 분석 등에 널리쓰인다.
왜 다차원 배열을 다루는가? - NumPy를 사용하는 이유
1) 데이터의 대부분은 숫자 배열로 볼 수 있다.
ex)
흑백이미지는 해당 픽셀에 대한 명암을 나타내는 2차원 배열 데이터로 나타낼 수 있다.
사운드 데이터는 시간 대비 음악을 나타내는 1차원 배열로 볼 수 있다.
2) 파이썬 리스트에 비해, 빠른 연산을 지원하고 메모리를 효율적으로 사용할 수 있다.
2️⃣ 배열 (Array)
1) 배열 생성
np.array()
import numpy as np
np.array([1, 2, 3, 4, 5]) # array([1, 2, 3, 4, 5])
np.array([3, 1.4, 2, 3, 4]) # array([3. , 1.4, 2. , 3. , 4. ])
np.array([[1, 2], [3, 4]]) # array([[1, 2], [3, 4]])
np.array([1, 2, 3, 4], dtype='float') # array([1., 2., 3., 4.])
2) 배열 데이터 타입 dtype
- Python List와 다르게 array는 단일타입으로 구성된다.
dtype | 설명 | 다양한 표현 |
int | 정수형 타입 | i, int_, int32, int64, i8 |
float | 실수형 타입 | f, float_, float32, float64, f8 |
str | 문자열 타입 | str, U, U32 |
bool | 부울 타입 | ?, bool_ |
- 배열의 데이터 타입 확인
array.dtype
- 배열의 데이터 타입 수정
array.astype(타입)
ex)
arr = np.array([1, 2, 3, 4], dtype=float) # array([1., 2., 3., 4.])
# array의 데이터 타입 확인
arr.dtype
# dtype('float64')
# array의 데이터 타입 바꾸기
arr.astype(int)
# array([1, 2, 3, 4])
3) 다양한 배열 만들기
- np.zeros(데이터 형태, dtype=타입) : 0이 들어있는 배열 생성
- np.ones(데이터 형태, dtype=타입) : 1이 들어있는 배열 생성
- np.arange(시작값, 끝값, 간격) : 배열 버전의 range 함수
- np.linspace(시작값, 끝값, 갯수)
- np.empty(데이터 형태, dtype=타입) : 초기화가 없는 값으로 배열을 반환
np.zeros(10, dtype=int)
# array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
np.ones((3, 5), dtype=float)
# array([[1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1.]])
np.arange(0, 20, 2)
# array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
np.arange(1, 16).reshape(3,5)
# array([1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15])
np.linspace(0, 1, 5)
# array([0. , 0.25, 0.5 , 0.75, 1. ])
4) 난수로 채워진 배열 만들기
- random.random(데이터 형태)
- random.normal(평균, 표준편차, 데이터 형태) : 표준정규분포로 데이터 추출
- random.randint(시작값, 끝값, 데이터 형태)
np.random.random((2, 2))
# array([[0.30986539, 0.85863508],
# [0.89151021, 0.19304196]])
np.random.normal(0, 1, (2, 2))
# array([[ 0.44050683, 0.04912487],
# [-1.67023947, -0.70982067]])
np.random.randint(0, 10, (2, 2))
# array([[3, 9],
# [3, 2]])
예시)
# 0이상 10 미만의 랜덤한 값이 들어있는 2*4크기의 배열
np.random.randint(0,10,(2,4))
5) 배열의 기초
ndim, shape, size, dtype
x2 = np.random.randint(10, size=(3, 4))
# array([[2, 2, 9, 0],
# [4, 2, 1, 0],
# [1, 8, 7, 3]])
x2.ndim # 2 : 배열의 차원
x2.shape # (3, 4) : 배열의 모양
x2.size # 12 : 원소의 개수
x2.dtype # dtype('int64') : 타입
6) Indexing
: 인덱스로 값을 찾아내는 것
# [0, 1, 2, 3, 4, 5, 6]
x = np.arange(7)
x[3] # 3
x[7] # IndexError: index 7 is out of bounds
x[0] = 10 # array([10, 1, 2, 3, 4, 5, 6])
7) Slicing
: 인덱스 값으로 배열의 부분을 가져오는 것
# [0, 1, 2, 3, 4, 5, 6]
x = np.arange(7)
x[1:4] # array([1, 2, 3])
x[1:] # array([1, 2, 3, 4, 5, 6])
x[:4] # array([0, 1, 2, 3])
x[::2] # array([0, 2, 4, 6])
# 2차원 배열
#1부터 15까지 들어있는 (3,5)짜리 배열
matrix = np.arange(1, 16).reshape(3,5)
# 행은 인덱스 0부터 인덱스 1까지, 열은 인덱스 1부터 인덱스 3까지
matrix[0:2,1:4]
8) reshape
: array의 shape를 변경한다.
x = np.arange(8)
x.shape
# (8,)
x2 = x.reshape((2, 4))
# array([[0, 1, 2, 3],
# [4, 5, 6, 7]])
x2.shape
# (2, 4)
9) concatenate
: array를 이어 붙인다.
x = np.array([0, 1, 2])
y = np.array([3, 4, 5])
np.concatenate([x, y])
# array([0, 1, 2, 3, 4, 5])
예시)
matrix = np.arange(4).reshape(2, 2)
# [0 1
# 2 3]
# 세로 방향으로 이어붙이기
np.concatenate([matrix, matrix], axis=0)
# [0 1
# 2 3
# 0 1
# 2 3]
# 가로 방향로 이어붙이기
np.concatenate([matrix, matrix], axis=1)
# [0 1 0 1
# 2 3 2 3]
10) split
: axis 축을 기준으로 분할한다.
matrix = np.arange(16).reshape(4, 4)
upper, lower = np.split(matrix, [3], axis=0)
matrix = np.arange(16).reshape(4, 4)
left, right = np.split(matrix, [3], axis=1)
3️⃣ numpy 연산
루프는 느리다
간단한 데이터에 대해서는 문제없이 수행 가능하나 만약 array의 크기가 크다면?
def add_five_to_array(values):
output = np.empty(len(values))
for i in range(len(values)):
output[i] = values[i] + 5
return output
# 크기가 큰 array
big_array = np.random.randint(1, 100, size=10000000)
for문을 통해 연산 → 처리시간 : 5.3 s
add_five_to_array(big_array)
# 5.3 s ± 286 ms per loop (mean ± std. dev. of 7 runs, 5 loops each)
numpy 연산 → 처리시간 : 33.5 ms
big_array + 5
# 33.5 ms ± 1.94 ms per loop (mean ± std. dev. of 7 runs, 5 loops each)
NumPy는 이런 연산을 미리 컴파일된 루틴으로 만들어놓아서 매우 빠른 속도로 실행이 가능하다.
1) 기본 연산 (universal function)
array는 +, - * , / 에 대한 기본 연산을 지원한다.
x = np.arange(4)
# array([0, 1, 2, 3])
x + 5 # array([5, 6, 7, 8])
x - 5 # array([-5, -4, -3, -2])
x * 5 # array([0, 5, 10, 15])
x / 5 # array([0. , 0.2, 0.4, 0.6])
다차원 행렬에서도 적용 가능하다.
x = np.arange(4).reshape((2, 2))
y = np.random.randint(10, size=(2, 2))
# [ 0 1 [1 6
# 2 3] 4 2]
x + y
# array([[1, 7],
# [6, 5]])
x - y
# array([[-1, -5],
# [-2, 1]])
2) 브로드캐스팅 (Broadcasting)
: shape이 다른 array끼리 연산
예시1)
예시2)
예시3)
4️⃣ 집계함수 & 마스킹 연산
집계함수
집계 : 데이터에 대한 요약 통계
x = np.arange(8).reshape((2, 4))
# [ 0 1 2 3
# 4 5 6 7]
np.sum(x) # 28 (합계)
np.min(x) # 0 (최솟값)
np.max(x) # 7 (최댓값)
np.mean(x) # 3.5 (평균값)
np.std(x) # 2.29128784747792 (표준편차)
np.sum(x, axis=0) # array([4, 6, 8, 10]) (각 열의 합)
np.sum(x, axis=1) # array([6, 22]) (각 행의 합)
마스킹 연산
마스킹 연산 : True, False array를 통해서 특정 값들을 뽑아내는 방법
x = np.arange(5)
# array([0, 1, 2, 3, 4])
x < 3 # array([True, True, True, False, False])
x > 5 # array([False, False, False, False, False])
x[x < 3] # array([0, 1, 2])
'개발공부 > 🎅 Python' 카테고리의 다른 글
[Python] Pandas 심화 알아보기 (0) | 2022.09.27 |
---|---|
[Python] Pandas 기본 알아보기 (0) | 2022.09.27 |
[Python] TED 강연을 통해 접해 보는 복잡한 형태의 데이터 (0) | 2022.09.23 |
[Python] 넷플릭스 시청 데이터로 알아 보는 데이터형 변환 (0) | 2022.09.23 |
[Python] 영어 단어 모음으로 시작하는 데이터 시각화 (0) | 2022.09.21 |
프론트엔드 개발자 삐롱히의 개발 & 공부 기록 블로그