넘파이 브로드캐스트 (Numpy broadcast)
NumPy 브로드캐스팅(broadcasting)은 서로 다른 형태(shape)의 배열 간에 산술 연산을 가능하게 하는 기능입니다. 낮은 차원의 배열이 더 높은 차원의 배열과 연산할 수 있도록 확장됩니다.
예를 들어, (5,4)
배열과 (1,4)
배열이 있을 때, 첫 번째 차원은 1이므로 5로 확장됩니다. 하지만 브로드캐스팅은 메모리를 실제로 복제하진 않습니다.
브로드캐스팅이 가능하려면 다음 두 조건 중 하나를 만족해야 합니다:
- 해당 차원의 크기가 같아야 합니다.
- 해당 차원 중 하나의 배열의 크기가 1이어야 합니다.
import numpy as np
A = np.array([[1, 2, 3], [4, 5, 6]]) # 크기가 (2, 3)인 2차원 배열
b = np.array([1, 0, 1]) # 크기가 (3,)인 1차원 배열
# 브로드캐스팅을 통한 덧셈
result = A + b
print(result)
# 출력:
# [[2 2 4]
# [5 5 7]]
넘파이의 기능들
NumPy의 배열(Array)에는 배열의 구조와 데이터 형식에 관한 중요한 속성이 있습니다:
Shape
shape
속성은 배열의 각 차원의 크기를 나타내는 튜플입니다. 배열의 shape
을 확인하면, 배열이 몇 차원인지와 각 차원에 몇 개의 요소가 있는지 알 수 있습니다.
예를 들어:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape)
이 코드는 (2, 3)
을 출력합니다. 이는 arr
배열이 2행 3열의 2D 배열임을 의미합니다.
dtype
dtype
속성은 배열에 저장된 데이터의 타입을 나타냅니다. NumPy는 다양한 숫자 타입을 지원하며 (예: int32
, float64
, complex128
), dtype
을 통해 배열의 데이터 타입을 확인하거나 지정할 수 있습니다.
예를 들어:
import numpy as np
arr = np.array([1, 2, 3])
print(arr.dtype)
이 코드는 배열 arr
의 데이터 타입인 int64
(또는 운영 체제에 따라 int32
)를 출력합니다.
dtype
을 지정하여 배열을 생성할 수도 있습니다:
import numpy as np
arr = np.array([1, 2, 3], dtype=np.float64)
print(arr.dtype)
이 코드는 float64
를 출력합니다. 배열의 요소들이 이제 부동 소수점 숫자로 저장됩니다.
넘파이 선형대수 연산
NumPy는 선형대수 연산을 위한 다양한 함수와 메소드를 제공하는 numpy.linalg
서브모듈을 포함하고 있습니다. 이 모듈을 사용하면 벡터와 행렬 연산을 수행할 수 있으며, 기본적인 선형대수 연산부터 고급 연산까지 가능합니다. 다음은 몇 가지 중요한 선형대수 연산입니다:
선형대수 연산에 관한 설명은 따로 포스트해서 작성해보겠습니다. 아래는 예제코드입니다.
행렬 곱셈 (Dot Product)
두 배열의 내적, 즉 행렬 곱셈을 수행합니다.
np.dot(a, b)
# 또는
a.dot(b)
행렬 벡터 곱셈 (Matrix-Vector Product)
행렬과 벡터 간의 곱셈을 수행합니다.
np.dot(A, v)
# 여기서 A는 2D 배열(행렬), v는 1D 배열(벡터)
노름 (Norm)
벡터나 행렬의 노름을 계산합니다. 노름은 벡터의 길이나 행렬의 크기를 나타냅니다.
np.linalg.norm(x)
역행렬 (Inverse)
정사각 행렬의 역행렬을 계산합니다.
np.linalg.inv(A)
행렬식 (Determinant)
행렬의 행렬식을 계산합니다.
np.linalg.det(A)
고유값과 고유벡터 (Eigenvalues and Eigenvectors)
정사각 행렬의 고유값과 고유벡터를 계산합니다.
eigenvalues, eigenvectors = np.linalg.eig(A)
특이값 분해 (Singular Value Decomposition, SVD)
행렬의 특이값 분해를 수행합니다.
U, s, V = np.linalg.svd(A)
Solving Linear Systems
Ax = b
형태의 선형 시스템을 해결합니다.
x = np.linalg.solve(A, b)
최소 제곱 해 (Least Squares Solution)
과도하게 결정된 시스템에 대한 최소 제곱 해를 구합니다.
x, residuals, rank, s = np.linalg.lstsq(A, b)
QR 분해 (QR Decomposition)
행렬을 직교 행렬(Q)과 상삼각 행렬(R)로 분해합니다.
Q, R = np.linalg.qr(A)
NumPy의 linalg
모듈은 성능이 매우 뛰어나고, 내부적으로 최적화된 LAPACK와 BLAS 라이브러리를 사용하기 때문에 매우 빠르게 계산이 가능합니다.