본문 바로가기
2학년 2학기/데이터 사이언스 입문

Numpy - 브로드캐스팅

by print_soo 2024. 9. 26.

브로드캐스팅(Broadcasting)은 넘파이에서 크기가 다른 배열들 간의 연산을 할 수 있게 해주는 강력한 기능이다. 일반적으로 크기가 같은 배열끼리만 요소별 연산이 가능하지만, 브로드캐스팅은 크기가 다른 배열끼리도 연산이 가능하게 만들어준다..

[브로드캐스팅의 동작원리]


[브로드캐스팅 규칙]

  1. 두 배열의 차원이 다른 경우, 더 적은 차원을 가진 배열 Shape의 앞쪽은 1로 채워 차원을 증가시킨다.
  2. 두 배열의 Shape가 일치하지 않는다면, 일치하지 않는 차원의 Shape가 1인 배열이 다른 Shape와 일치하도록 늘어난다.
  3. 임의의 차원에서 크기가 일치하지 않고, 1도 아닌 경우에는 오류가 발생하다.

 

1. 더 적은 차원을 가진 배열은 Shape의 앞쪽이 1로 채워져 차원이 증가한다.

 

두 배열의 차원이 다를 때, 차원이 더 적은 배열은 1로 채워져 차원을 맞춘다. 예를 들어, 1차원 배열과 2차원 배열을 더할 때, 1차원 배열은 2차원 배열의 행의 수에 맞춰 확장된다.

 

 

 

예시 1: 1차원 배열과 2차원 배열 간의 브로드캐스팅

import numpy as np

# 2x3 배열 (2차원 배열)
arr2d = np.array([[1, 2, 3], [4, 5, 6]])

# 1차원 배열
arr1d = np.array([10, 20, 30])

# 브로드캐스팅을 통해 차원 확장
result = arr2d + arr1d
print("2차원 배열과 1차원 배열의 덧셈 결과:\n", result)

 

결과:

2차원 배열과 1차원 배열의 덧셈 결과:
 [[11 22 33]
  [14 25 36]]

 

설명:

  • arr1d는 (3,) 크기의 1차원 배열이고, arr2d는 (2, 3) 크기의 2차원 배열이다.
  • arr1d는 자동으로 (1, 3)으로 변환되어 arr2d와 크기를 맞춘다. 그 결과, 2차원 배열이 만들어짐.

2. 두 배열의 Shape가 일치하지 않는다면, 일치하지 않는 차원의 Shape가 1인 배열이 다른 배열의 Shape와 일치하도록 늘어난다.

 

이 규칙은 배열의 크기가 1인 차원이 있을 경우, 그 차원이 다른 배열의 크기와 일치하도록 확장된다는 의미야. 이때, 배열은 해당 차원의 값이 복사되는 것처럼 동작한다.

 

 

 

예시 2: 3x1 배열과 1x3 배열의 브로드캐스팅

# 3x1 배열
arr3x1 = np.array([[1], 
                   [2], 
                   [3]])

# 1x3 배열
arr1x3 = np.array([10, 20, 30])

# 브로드캐스팅을 통해 배열의 크기를 맞춤
result = arr3x1 + arr1x3
print("3x1 배열과 1x3 배열의 덧셈 결과:\n", result)

 

결과:

3x1 배열과 1x3 배열의 덧셈 결과:
 [[11 21 31]
  [12 22 32]
  [13 23 33]]

 

설명:

  • arr3x1은 (3, 1) 크기의 배열이고, arr1x3은 (1, 3) 크기의 배열이다.
  • 넘파이는 자동으로 두 배열을 (3, 3) 크기로 확장하여, 각각의 값들이 요소별로 더해진다.
  • arr3x1의 열이 1이므로, 각 값이 arr1x3와 동일한 크기가 될 때까지 복사되어 덧셈이 이루어진다..

3. 임의의 차원에서 크기가 일치하지 않고, 1도 아닌 경우에는 오류가 발생한다.

 

만약 두 배열의 Shape에서 일치하지 않는 차원의 크기가 다르고, 그 크기가 1도 아니라면 브로드캐스팅은 불가능하고 오류가 발생한다.

 

 

예시 3: 크기가 맞지 않아서 발생하는 오류

# 2x3 배열
arr2x3 = np.array([[1, 2, 3], 
                  [4, 5, 6]])

# 3x2 배열
arr3x2 = np.array([[1, 2], 
                   [3, 4], 
                   [5, 6]])

# 두 배열의 크기가 맞지 않아 오류 발생
result = arr2x3 + arr3x2  # 이 줄에서 오류 발생

 

결과:

ValueError: operands could not be broadcast together with shapes (2,3) (3,2)

 

설명:

  • arr2x3은 (2, 3) 크기의 배열이고, arr3x2는 (3, 2) 크기의 배열이다.
  • 각 차원의 크기가 서로 맞지 않고, 두 배열의 어떤 차원도 1이 아니기 때문에 브로드캐스팅이 불가능하고 오류가 발생한다.
  • 이런 경우에는 배열의 모양을 맞춰주지 않으면 연산을 할 수 없다.

중요:

브로드캐스팅이 되려면 반드시 둘 중 하나가 1차원일 필요는 없고, 각 차원에서 크기가 일치하거나 1인 차원이 있어야 브로드캐스팅이 가능

 

'2학년 2학기 > 데이터 사이언스 입문' 카테고리의 다른 글

Fancy Indexing  (0) 2024.10.05
비교, 마스크, Bool 연산  (0) 2024.10.05
Numpy - Ufunc  (1) 2024.09.26
Numpy - 배열 내 요소 접근(인덱싱과 슬라이싱)  (0) 2024.09.26
Numpy - ndarray의 속성  (0) 2024.09.26