Python 필수 라이브러리 NumPy 기본 사용법

NumPy란?

데이터 분석, 머신러닝 및 딥러닝에서 대부분의 데이터는 벡터와 행렬로 표현된다. Numpy는 Python 언어에서 기본으로 지원하지 않는 행렬과 같은 데이터 구조를 지원하며 수학/과학 계산 함수를 포함한다. 따라서 데이터 사이언스를 위한 기본적인 Numpy 사용법을 정리하였다.

NumPy는 Numerical Python의 줄임말로 고성능의 수치계산을 위해 제작되었다. C언어로 구현된 파이썬 라이브러리로써 벡터 및 행렬 연산이 매우 빠르며 편리한 기능을 제공한다.

NumPy에서는 기본적으로 array(배열)라는 단위로 데이터를 관리하며 연산을 수행한다. Array는 행렬의 개념이다. 따라서 다양한 선형대수 연산을 제공하며 N차원의 array 객체를 지원한다.

import numpy as np

# list
print(list(range(5)))
# [0, 1, 2, 3, 4]

# Numpy의 Array
print(np.array([0, 1, 2, 3, 4]))
# array([0, 1, 2, 3, 4])

배열 만들기

  • np.array - 배열 생성
  • np.zeros(shape) - 0이 들어있는 배열 생성
  • np.ones(shape) - 1이 들어있는 배열 생성
  • np.empty(shape) - 초기화가 없는 값으로 배열을 반환
  • np.arange(n, m, d) - n~m까지 d간격으로 쪼개기. range와 동일
  • np.linspace(n, m, k) - n~m까지 k개로 쪼개기
np.zeros(10, dtype=int)
# array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

np.enes(10, dtype=int)
# array([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.linspace(0, 1, 5)
# array([0. , 0.25, 0.5 , 0.75, 1. ])

난수 배열 생성

np.random로 다양한 난수가 들어있는 배열을 size대로 생성할 수 있다.

  • np.random.seed: 시드 고정
  • np.random.rand(size): 균등 분포를 따르는 난수 생성 (0~1 사이)
  • np.random.randint(low, high, size): 정수값 난수 생성 (low~high 사이)
  • np.random.randn(size): 표준정규분포 (-1~1 사이)
    • 표준편차/평균을 변경하고 싶다면 표준편차를 곱하고 평균을 더해서 사용 가능Z Ex. np.random.randn(10) * 0.1 + 5
  • np.random.normal(n, s, size): 정규분포(평균 n, 표준편차 s)를 따르는 난수 생성
  • np.random.uniform(low, high, size): 균등 분포를 따르는 난수 생성 (low~high 사이)
np.random.rand(3)
# array([0.63201094, 0.70317091, 0.46477066])

np.random.randint(0,5,(3,5))
# array([[3, 9],
#        [3, 2]])

np.random.randn(3)
# array([-1.72954903, -0.961878, -0.10157975])

np.random.normal(0, 1, (2, 2))
# array([[ 0.44050683,  0.04912487],
#        [-1.67023947, -0.70982067]])

np.random.uniform(5, 10, 5)
# array([5.7274501 , 6.4652199 , 8.15371616, 8.89358985, 9.64812358])

배열의 정보

  • array.ndim - 차원
  • array.shape - 모양
  • array.size - 크기(자료의 개수)
  • array.dtype - 배열이 담고 있는 요소들의 자료형: list와 다르게 array는 단일타입으로 구성
    • array.astype(dtype) - 자료형 변경
dtype 설명
int 정수형
float 실수형
str 문자열
bool 부울

배열의 모양 바꾸기

  • array.reshape(n,m)
  • np.concatenate([array1, array2, ..., arrayN], axis) : axis=0 세로, axis=1 가로로 붙이기
  • np.split(array, [index], axis): index 기준으로 나누기 (여러개 가능)

다양한 집계함수

  • +, -, /, *, **: element-wise 산술 연산
  • np.sum(array): 합계
  • np.max/min(array): 최대/최소값
  • np.mean(array): 평균
  • np.std(array): 표준편차
  • np.var(array): 분산
  • np.argmin/max(array): 최소/최대값의 index 반환
  • np.where(array 조건): 조건에 맞는 값의 index 반환

마스킹 연산

조건을 만족하는 값만 따로 추출할 수 있다.

  • array[(array 조건1) (array 조건2)...]
array[(array < 3) | (array > 5)]

선형대수

  • A*B: 행렬 인자(element-wise) 곱셈
  • np.dot(A, B): 1차원 벡터 내적
  • np.matmul(A, B): 2차원 행렬곱
  • A.transpose(), A.T: 전치행렬
  • np.linalg.inv(A): 역행렬
A = np.array([[1, 2], [2, 2]])
# [[1 2]
#  [2 2]]

B = np.array([[1, 3], [0, 5]])
# [[1 3]
#  [0 5]]

C = np.array([1, 2, 3])
D = np.array([4, 5, 6])

# element-wise 곱셈
print(A*B)
# [[ 1  6]
#  [ 0 10]]

print(C*D)
# [ 4 10 18]

# 1차원 벡터 내적
print(np.dot(C, D))
# 32

# 2차원 행렬곱
print(np.matmul(A, B))
# [[ 1 13]
#  [ 2 16]]

# 전치행렬
print(A.T)
# [[1 2]
#  [2 2]]

# 역행렬
print(np.linalg.inv(A))
# [[-1.   1. ]
#  [ 1.  -0.5]]