NumPy
📋 문서 버전
이 문서는 2개의 버전이 있습니다. 현재 최신 버전을 보고 있습니다.
numpy
개요
NumPy(Numerical Python의 약자)는 파이썬에서 과학적 계산과 데이터 분석을 위한 핵심 라이브러리 중 하나로, 고성능의 다차 배열 객체(nd)와 이를 효율 다루기 위한 수학적 함수 제공합니다. NumPy는 Python의 기본보다 훨씬 빠르고 메모리 효율적인 배열 연산을 가능하게 하며, 데이터과학, 기계학습, 물리학, 공학 등 다양한 분야에서 필수적으로 사용됩니다.
NumPy는 2005년에 Travis Oliphant에 의해 개발되었으며, 현재는 커뮤니티 기반으로 지속적으로 유지보수되고 있습니다. 이 라이브러리는 pandas, matplotlib, scikit-learn, TensorFlow 등 주요 데이터과학 도구들의 기반이 되는 핵심 구성 요소입니다.
주요 기능
1. <a href="/doc/%EA%B8%B0%EC%88%A0/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B5%AC%EC%A1%B0/%EB%8B%A4%EC%B0%A8%EC%9B%90%20%EB%B0%B0%EC%97%B4/ndarray" class="wiki-link wiki-link-missing">ndarray</a>: 다차원 배열 객체
NumPy의 핵심은 ndarray(n-dimensional array)입니다. 이 객체는 동일한 데이터 타입의 요소로 구성된 고정 크기의 배열이며, C 언어 수준의 성능을 제공합니다.
import numpy as np
# 1차원 배열 생성
arr1 = np.array([1, 2, 3, 4])
print(arr1) # [1 2 3 4]
# 2차원 배열 생성
arr2 = np.array([[1, 2], [3, 4]])
print(arr2)
# [[1 2]
# [3 4]]
ndarray는 다음과 같은 특징을 가집니다:
- 고정 크기: 배열 생성 후 크기 변경이 비효율적입니다.
- 동일한 데이터 타입: 모든 요소는 같은 타입이어야 하며, 메모리 배치가 연속적입니다.
- 벡터화 연산: 요소별 연산을 루프 없이 수행 가능 (예: arr * 2).
2. 수학적 연산 지원
NumPy는 선형대수, 통계, 삼각함수, 지수/로그 함수 등 다양한 수학적 연산을 제공합니다.
# 기본 연산
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(np.sqrt(a)) # [1. 1.41421356 1.73205081]
3. 배열 생성 함수
NumPy는 다양한 방식으로 배열을 생성할 수 있는 함수를 제공합니다.
| 함수 | 설명 |
|---|---|
<a href="/doc/%EA%B8%B0%EC%88%A0/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99/%EB%B0%B0%EC%97%B4%20%EC%83%9D%EC%84%B1/np.zeros" class="wiki-link wiki-link-missing">np.zeros</a>() |
0으로 채워진 배열 생성 |
<a href="/doc/%EA%B8%B0%EC%88%A0/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99/%EB%B0%B0%EC%97%B4%20%EC%83%9D%EC%84%B1/np.ones" class="wiki-link wiki-link-missing">np.ones</a>() |
1로 채워진 배열 생성 |
<a href="/doc/%EA%B8%B0%EC%88%A0/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99/%EB%B0%B0%EC%97%B4%20%EC%83%9D%EC%84%B1/np.arange" class="wiki-link wiki-link-missing">np.arange</a>() |
범위 내 숫자 배열 생성 (step 가능) |
<a href="/doc/%EA%B8%B0%EC%88%A0/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99/%EB%B0%B0%EC%97%B4%20%EC%83%9D%EC%84%B1/np.linspace" class="wiki-link wiki-link-missing">np.linspace</a>() |
균등 간격의 숫자 배열 생성 |
<a href="/doc/%EA%B8%B0%EC%88%A0/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99/%EB%82%9C%EC%88%98%20%EC%83%9D%EC%84%B1/np.random.rand" class="wiki-link wiki-link-missing">np.random.rand</a>() |
난수 배열 생성 |
zeros = np.zeros((2, 3)) # 2x3 배열, 모든 요소 0
ones = np.ones((3,)) # 1차원 배열 [1. 1. 1.]
range_arr = np.arange(0, 10, 2) # [0 2 4 6 8]
linspace_arr = np.linspace(0, 1, 5) # [0. 0.25 0.5 0.75 1. ]
4. 배열 조작
NumPy는 배열의 형태를 변경하거나 결합하는 다양한 기능을 제공합니다.
arr = np.array([[1, 2], [3, 4]])
# 형태 변경 (reshape)
reshaped = arr.reshape(4,) # [1 2 3 4]
# 전치 (transpose)
transposed = arr.T # [[1 3], [2 4]]
# 배열 결합
a = np.array([1, 2])
b = np.array([3, 4])
concat = np.concatenate([a, b]) # [1 2 3 4]
성능 및 효율성
NumPy는 C로 구현된 내부 루틴을 사용하여 연산을 수행하므로, Python의 기본 반복문보다 수십에서 수백 배 빠릅니다. 특히 벡터화(vectorization)를 통해 반복문 없이 전체 배열에 대해 연산을 수행할 수 있어, 코드도 간결해지고 성능도 향상됩니다.
예를 들어, 100만 개의 숫자에 각각 2를 더하는 작업을 비교하면:
import numpy as np
import time
# Python 리스트 (느림)
py_list = list(range(1000000))
start = time.time()
result = [x + 2 for x in py_list]
print("Python list:", time.time() - start)
# NumPy 배열 (빠름)
np_array = np.arange(1000000)
start = time.time()
result = np_array + 2
print("NumPy array:", time.time() - start)
이러한 성능 차이는 대용량 데이터 처리에서 특히 중요합니다.
데이터과학에서의 역할
NumPy는 데이터과학 파이프라인의 기초를 형성합니다. 주요 활용 사례는 다음과 같습니다:
- 데이터 전처리: 결측치 처리, 정규화, 스케일링 등
- 수치 계산: 행렬 연산, 통계 분석
- 기계학습 입력 형식: 대부분의 ML 라이브러리는 NumPy 배열을 입력으로 요구
- 시각화 준비: matplotlib 등과 연계하여 데이터를 시각화하기 전 처리
또한, pandas의 DataFrame과 Series 내부에서도 NumPy 배열이 사용되며, 두 라이브러리 간의 상호 운용성이 매우 높습니다.
설치 및 사용 방법
NumPy는 일반적으로 pip 또는 conda를 통해 설치합니다.
pip install numpy
또는 Anaconda 사용자라면:
conda install numpy
사용 시에는 관례적으로 np라는 별칭(alias)으로 임포트합니다.
import numpy as np
참고 자료 및 관련 문서
- 공식 문서
- GitHub 저장소
- 관련 라이브러리:
- pandas: 데이터 분석을 위한 고수준 구조 제공
- SciPy: 과학적 계산 확장 라이브러리
- matplotlib: 시각화 도구 (NumPy 배열과 호환)
- scikit-learn: 머신러닝 라이브러리 (입력 데이터로 NumPy 배열 사용)
NumPy는 데이터과학 생태계의 기반이 되는 도구로서, 파이썬을 사용하는 데이터 전문가라면 반드시 숙지해야 할 라이브러리입니다.
ndarray의 주요 속성
ndarray는 다음과 같은 핵심 속성을 통해 배열의 정보를 확인할 수 있습니다:
- shape: 배열의 차원 크기 (예: (3, 4))
- dtype: 배열 요소의 데이터 타입 (예: int64, float32)
- size: 전체 요소의 개수
- ndim: 차원 수 (랭크)
브로드캐스팅 (Broadcasting)
브로드캐스팅은 서로 다른 크기의 배열 간에 연산을 수행할 수 있게 해주는 기능으로, 작은 배열이 자동으로 큰 배열의 형태에 맞게 확장되어 연산됩니다.
a = np.array([[1, 2], [3, 4]])
b = np.array([10, 20])
result = a + b # b가 [[10, 20], [10, 20]]로 확장됨
# 결과: [[11, 22], [13, 24]]
배열 슬라이싱과 인덱싱
NumPy는 정수 인덱싱, 슬라이싱, 불리언 인덱싱, 정수 배열 인덱싱 등 고급 인덱싱을 지원합니다.
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 슬라이싱
print(arr[0:2, 1:3]) # [[2, 3], [5, 6]]
# 불리언 인덱싱
mask = arr > 5
print(arr[mask]) # [6, 7, 8, 9]
선형 대수 및 행렬 연산 확장
numpy.linalg 모듈을 통해 더 심화된 행렬 연산을 수행할 수 있습니다:
- 행렬식 계산: np.linalg.det()
- 고유값/고유벡터 분해: np.linalg.eig()
- 행렬 곱셈 연산자: np.dot() 외에도 @ 연산자를 사용하여 행렬 곱을 수행할 수 있습니다.
# 행렬 곱 예시
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print(A @ B) # 행렬 곱
배열 조작 및 파일 입출력
- 배열 변형:
np.vstack()을 이용한 수직 결합이나flatten()을 이용한 1차원 펼치기 기능을 제공합니다. - 파일 저장/불러오기: 배열을 바이너리 형식(
.npy)으로 저장하고 불러올 수 있습니다.
# 저장 및 불러오기
np.save('array.npy', arr)
loaded_arr = np.load('array.npy')
추가 지원 기능 및 응용 분야
- 푸리에 변환: 선형대수 외에 푸리에 변환(Fourier Transform) 기능을 제공합니다.
- 외부 언어 통합: C/C++, 포트란 코드와의 통합 인터페이스를 지원합니다.
- 이미지 처리: 픽셀 데이터를 3차원 배열로 취급하여 처리합니다.
- 금융 및 시계열 분석: 고속 연산을 활용한 금융 데이터 처리에 사용됩니다.
라이선스 및 참고 문헌
- 라이선스: BSD 라이선스 하에 배포됩니다.
- 추가 도서 및 문헌:
- Jake VanderPlas, Python Data Science Handbook (O'Reilly)
- Wes McKinney, Python for Data Analysis (O'Reilly)
- Oliphant, T. E. (2006). A guide to NumPy. Trelgol Publishing.
ndarray의 주요 속성
shape: 배열의 차원 크기 (예:(3, 4))dtype: 요소의 데이터 타입 (예:int64,float32)size: 전체 요소 수ndim: 차원 수
배열 생성 함수 추가 기능
| 함수 | 설명 |
|---|---|
np.full((2,2), 7) |
특정 값으로 채워진 배열 생성 |
브로드캐스팅 (Broadcasting)
브로드캐스팅은 크기가 다른 배열 간 연산을 가능하게 해주는 강력한 기능입니다. 작은 배열이 자동으로 큰 배열의 형태에 맞춰 확장됩니다. 이는 메모리 복사를 하지 않기 때문에 매우 효율적입니다.
a = np.array([[1, 2], [3, 4]]) # (2, 2)
b = np.array([10, 20]) # (2,)
c = a + b # b가 [[10, 20], [10, 20]]로 확장됨
인덱싱과 슬라이싱
NumPy 배열은 고급 인덱싱을 지원합니다.
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 슬라이싱
print(arr[0:2, 1:3]) # [[2 3], [5 6]]
# 불리언 인덱싱
print(arr[arr > 5]) # [6 7 8 9]
# 정수 배열 인덱싱
print(arr[[0, 2], [1, 2]]) # [2 9]
선형 대수 연산 (numpy.linalg)
NumPy는 numpy.linalg 모듈을 통해 행렬 연산을 지원합니다.
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# 행렬 곱
C = np.dot(A, B) # 또는 A @ B
# 행렬식
np.linalg.det(A)
# 고유값 분해
eigenvals, eigenvecs = np.linalg.eig(A)
주의사항 및 한계
- 학습 곡선: 인덱싱, 브로드캐스팅 등 개념 이해에 시간이 필요할 수 있음.
이 문서는 AI 모델(qwen/qwen3.6-35b-a3b)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.