🔢 Numpy (Numeric Python)
- 수학 및 과학 연산을 위한 파이썬 핵심 라이브러리입니다.
- 특히 배열이나 행렬 계산에 강력한 기능을 제공하며, 데이터 분석 라이브러리인 Pandas의 기반이 됩니다.
1. Numpy를 왜 쓸까? 🤔
- 빠른 속도: 핵심 부분이 C언어로 만들어져 있어, 파이썬 리스트보다 훨씬 빠르게 대용량 데이터를 처리합니다.
- 다차원 배열:
ndarray
라는 효율적인 다차원 배열 객체를 제공하여, 복잡한 데이터 구조를 쉽게 다룰 수 있습니다. (e.g., 이미지, 시계열 데이터) - 간결한 코드: 벡터화(Vectorization) 연산을 지원하여, 반복문 없이 배열 전체에 대한 연산을 한 줄로 깔끔하게 작성 가능합니다.
2. ndarray
: Numpy의 핵심 ✨
- 정의: Numpy의 기본 데이터 구조로, 같은 타입의 데이터를 가지는 다차원 배열입니다.
📝 ndarray
생성하기
import numpy as np
# 1차원 배열 (벡터)
arr1 = np.array([1, 2, 3, 4, 5])
# 2차원 배열 (행렬)
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
# 3차원 배열 (텐서)
arr3 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
📊 주요 속성
속성 | 설명 | 예시 (arr2 ) |
---|---|---|
ndim |
배열의 차원 수 | 2 |
shape |
각 차원의 크기를 튜플로 반환 | (2, 3) |
size |
배열의 전체 요소 개수 | 6 |
dtype |
배열 요소의 데이터 타입 | int32 |
3. 배열 생성 함수들 🏭
arange()
:range()
와 비슷하지만,ndarray
를 생성합니다.zeros()
,ones()
: 지정된shape
의 0 또는 1로 채워진 배열을 생성합니다.full()
: 지정된shape
에 특정 값으로 채워진 배열을 생성합니다.random.rand()
,random.randn()
,random.randint()
: 다양한 방식의 난수 배열을 생성합니다.
# 0부터 9까지의 배열
np.arange(10)
# 2x3 크기의 0으로 채워진 배열
np.zeros((2, 3))
# 3x3 크기의 7로 채워진 배열
np.full((3, 3), 7)
# 0과 1 사이의 균등 분포 난수로 2x2 배열 생성
np.random.rand(2, 2)
4. 인덱싱과 슬라이싱 🎯
- 파이썬 리스트와 유사하지만, 다차원 배열에 대한 강력한 슬라이싱 기능을 제공합니다.
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 특정 요소 접근 (1행 2열)
arr[1, 2] # 6
# 행 전체 슬라이싱 (0행)
arr[0, :] # array([1, 2, 3])
# 열 전체 슬라이싱 (1열)
arr[:, 1] # array([2, 5, 8])
# 부분 행렬 슬라이싱 (0~1행, 1~2열)
arr[:2, 1:]
# array([[2, 3],
# [5, 6]])
5. 주요 연산 및 함수 ⚙️
✨ 벡터화 연산 (Vectorization)
- 배열의 각 요소에 대해 반복문 없이 연산을 수행합니다. 코드가 간결해지고 속도가 매우 빠릅니다.
arr = np.array([1, 2, 3])
arr + 2 # array([3, 4, 5])
arr * 3 # array([3, 6, 9])
✨ 집계 함수
sum()
,mean()
,std()
,min()
,max()
등 통계 관련 함수를 제공합니다.axis
인자를 통해 특정 축(행/열) 기준으로도 계산 가능합니다.
arr = np.array([[1, 2, 3], [4, 5, 6]])
np.sum(arr) # 전체 합: 21
np.sum(arr, axis=0) # 열 기준 합: array([5, 7, 9])
np.sum(arr, axis=1) # 행 기준 합: array([ 6, 15])
✨ 형태 변경
reshape()
: 배열의 형태를 바꿉니다. (단, 전체 요소 개수는 같아야 합니다)flatten()
: 다차원 배열을 1차원으로 펼칩니다.
arr = np.arange(6) # [0, 1, 2, 3, 4, 5]
arr.reshape(2, 3)
# array([[0, 1, 2],
# [3, 4, 5]])