🔢 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]])