Element-wise 연산 (원소별 연산)

NumPy의 핵심: 연산자가 배열의 각 요소에 개별적으로 적용됩니다.

a = np.array([1, 2, 3, 4])
b = np.array([10, 20, 30, 40])

# 덧셈: 각 요소끼리 더하기
print(f"a + b = {a + b}")  # [11, 22, 33, 44]

# 곱셈: 각 요소끼리 곱하기
print(f"a * b = {a * b}")  # [10, 40, 90, 160]

# 제곱
print(f"a ** 2 = {a ** 2}")  # [1, 4, 9, 16]

# 스칼라 연산 (모든 요소에 적용)
print(f"a * 2 = {a * 2}")  # [2, 4, 6, 8]
print(f"a + 10 = {a + 10}")  # [11, 12, 13, 14]

Python List와의 차이:

# Python List
list_a = [1, 2, 3]
list_b = [10, 20, 30]
# list_a + list_b = [1, 2, 3, 10, 20, 30] (이어붙이기!)
# list_a * 2 = [1, 2, 3, 1, 2, 3] (반복!)

# NumPy Array
arr_a = np.array([1, 2, 3])
arr_b = np.array([10, 20, 30])
# arr_a + arr_b = [11, 22, 33] (원소별 덧셈)
# arr_a * 2 = [2, 4, 6] (원소별 곱셈)

Broadcasting (브로드캐스팅)

브로드캐스팅은 NumPy가 다른 크기의 배열끼리도 연산할 수 있게 해주는 메커니즘입니다.

기본 규칙

  1. 차원 수가 다르면, 작은 쪽에 크기 1인 차원을 앞쪽에 추가
  2. 각 차원에서 크기가 다르면, 크기가 1인 쪽을 큰 쪽에 맞춰 확장
  3. 어느 차원에서든 크기가 다르고 둘 다 1이 아니면 에러
# 예제 1: 스칼라 + 배열
arr = np.array([1, 2, 3])
result = arr + 10  # 10이 [10, 10, 10]으로 확장됨
print(f"[1,2,3] + 10 = {result}")  # [11, 12, 13]

# 예제 2: 1D + 2D
matrix = np.array([
    [1, 2, 3],
    [4, 5, 6]
])
vector = np.array([10, 20, 30])

result = matrix + vector
print("Matrix:\\n", matrix)
print("Vector:", vector)
print("Matrix + Vector:\\n", result)
# [[11, 22, 33],
#  [14, 25, 36]]브로드캐스팅은 NumPy가 부족한 차원을 '가상으로' 복사하여 두 배열의 모양을 맞춰주는 기능입니다.

matrix + vector 예제에서:

NumPy는 vector를 matrix의 각 행에 더해야 한다고 판단합니다.