numpy — 배열 연산의 힘
이 토픽을 마치면
numpy의 ndarray가 무엇인지 설명할 수 있고, 리스트 대비 장점과 기본 연산을 수행할 수 있습니다.
numpy가 뭔가
numpy(넘파이)는 Python에서 대량의 숫자 데이터를 빠르게 처리하는 라이브러리입니다.
python
import numpy as np
# 리스트 → ndarrayarr = np.array([1, 2, 3, 4, 5])print(arr) # [1 2 3 4 5]print(type(arr)) # <class 'numpy.ndarray'>np는 numpy의 관례적 약어입니다.
왜 리스트 대신 numpy인가
속도 차이
python
import numpy as np
# 100만 개 원소 각각에 2를 곱하기
# 순수 Python 리스트py_list = list(range(1_000_000))result = [x * 2 for x in py_list] # 느림
# numpynp_arr = np.arange(1_000_000)result = np_arr * 2 # 빠름 (10~100배)numpy는 내부적으로 C로 작성되어 있고, 연속된 메모리에 같은 타입의 데이터를 저장합니다. Python 리스트는 각 원소가 독립적인 Python 객체이지만, ndarray는 메모리가 붙어 있어 CPU 캐시에 유리합니다.
벡터 연산
python
import numpy as np
a = np.array([1, 2, 3])b = np.array([4, 5, 6])
# 원소별 연산 — 반복문 없이print(a + b) # [5 7 9]print(a * b) # [4 10 18]print(a ** 2) # [1 4 9]print(a > 2) # [False False True]리스트에서 이걸 하려면 for문을 돌려야 합니다. numpy는 한 줄로 끝납니다.
배열 만들기
python
import numpy as np
# 직접 만들기a = np.array([1, 2, 3])
# 0으로 채운 배열zeros = np.zeros(5) # [0. 0. 0. 0. 0.]
# 1로 채운 배열ones = np.ones(3) # [1. 1. 1.]
# 연속 숫자seq = np.arange(0, 10, 2) # [0 2 4 6 8]
# 균등 간격lin = np.linspace(0, 1, 5) # [0. 0.25 0.5 0.75 1. ]다차원 배열
python
import numpy as np
# 2차원 배열 (행렬)matrix = np.array([ [1, 2, 3], [4, 5, 6]])print(matrix.shape) # (2, 3) — 2행 3열print(matrix[0, 1]) # 2 — 0번 행, 1번 열print(matrix[:, 0]) # [1 4] — 모든 행의 0번 열
# 3차원도 가능cube = np.zeros((2, 3, 4))print(cube.shape) # (2, 3, 4)shape은 배열의 크기를 튜플로 알려줍니다. 데이터 분석, 이미지 처리, 머신러닝에서 shape을 자주 확인합니다.
자주 쓰는 연산
python
import numpy as np
arr = np.array([3, 1, 4, 1, 5, 9, 2, 6])
print(arr.sum()) # 31print(arr.mean()) # 3.875print(arr.std()) # 2.588...print(arr.min()) # 1print(arr.max()) # 9print(arr.argmax()) # 5 (최댓값의 인덱스)
# 정렬print(np.sort(arr)) # [1 1 2 3 4 5 6 9]
# 조건 필터print(arr[arr > 3]) # [4 5 9 6]
# reshape — 형태 변환reshaped = arr.reshape(2, 4)print(reshaped)# [[3 1 4 1]# [5 9 2 6]]브로드캐스팅
크기가 다른 배열끼리도 연산이 가능합니다.
python
import numpy as np
matrix = np.array([ [1, 2, 3], [4, 5, 6]])
# 각 행에 [10, 20, 30]을 더하기row = np.array([10, 20, 30])print(matrix + row)# [[11 22 33]# [14 25 36]]numpy가 자동으로 row를 2행으로 확장해서 연산합니다. 이것을 **브로드캐스팅(broadcasting)**이라고 합니다. 명시적으로 반복문을 쓸 필요가 없습니다.