BioPlayground

🧬
목록으로

numpy — 배열 연산의 힘

numpy의 ndarray가 무엇인지, 왜 리스트보다 빠르고, 어떻게 쓰는지 이해합니다.

입문
|
7
|
검증 완료 (2026-07)
진행률0/6 (0%)

numpy — 배열 연산의 힘

이 토픽을 마치면

numpy의 ndarray가 무엇인지 설명할 수 있고, 리스트 대비 장점과 기본 연산을 수행할 수 있습니다.


numpy가 뭔가

numpy(넘파이)는 Python에서 대량의 숫자 데이터를 빠르게 처리하는 라이브러리입니다.

python
import numpy as np
# 리스트 → ndarray
arr = 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] # 느림
# numpy
np_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()) # 31
print(arr.mean()) # 3.875
print(arr.std()) # 2.588...
print(arr.min()) # 1
print(arr.max()) # 9
print(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)**이라고 합니다. 명시적으로 반복문을 쓸 필요가 없습니다.