반응형
from IPython.display import Image
문제 설명
목표
같은 차원이지만 다른 모양을 가진 배열 간의 연산에서 어떻게 브로드캐스팅이 적용되는지 살펴봅시다.
같은 차원의 다른 모양을 가진 2차원 배열(행렬)의 경우
2차원 배열(행렬) 간의 덧셈 연산을 해봅시다. 예시로 3 x 3 배열(A)과 1 x 3 배열(B) 사이에 덧셈 연산, 그리고 3 x 3 배열(A)과 2 x 3 배열(C) 사이에 덧셈 연산을 행하는 코드를 살펴보겠습니다.
import numpy as np
A = [
[10, 10, 10],
[20, 20, 20],
[30, 30, 30]
]
B = [
[1, 2, 3]
]
C = [
[2, 2, 3],
[4, 5, 6],
]
A = np.array(A)
B = np.array(B)
C = np.array(C)
result = A + B
print(result)
[[11 12 13]
[21 22 23]
[31 32 33]]
result = A + C
print(result)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/var/folders/yz/pbmrbcx947s847jw36l2_14r0000gn/T/ipykernel_20297/3095445189.py in <module>
----> 1 result = A + C
2 print(result)
ValueError: operands could not be broadcast together with shapes (3,3) (2,3)
위 코드에서 A + B를 행하는 연산을 그림으로 나타내면 다음과 같습니다.
1 x 3 배열 B는 3 x 3 배열 A 모양의 맞춰 0차원을 기준으로 확장(1->3)하여 연산합니다.
배열 | 0차원 | 1차원 |
---|---|---|
A | 3 | 3 |
B | 1->3 | 3 |
그러나 2 x 3 배열 C는 3 x 3 배열 A 모양에 맞추지 못한다고 에러가 발생합니다. 이는 브로드캐스팅이 차원의 크기가 1일 때만 적용이 되기 때문입니다. 따라서 B는 0차원의 크기가 1이여서 브로드캐스팅이 적용되지만, C는 0차원의 크기가 2이므로 브로드캐스팅이 적용되지 않습니다.
배열 | 0차원 | 1차원 |
---|---|---|
A | 3 | 3 |
B | 2->x | 3 |
또 다른 예시 1 x 3 배열과 3 x 1 배열의 연산을 살펴봅시다.
A = [
[1],
[2],
[3]
]
B = [
[1, 2, 3]
]
A = np.array(A)
B = np.array(B)
result = A + B
print(result)
[[2 3 4]
[3 4 5]
[4 5 6]]
위 코드에서 행하는 연산을 그림으로 나타내면 다음과 같습니다.
1 x 3 배열 B는 A의 0차원의 크기인 3에 맞춰, 3 x 1 배열 A는 B의 1차원의 크기 3에 맞춰 확장하며 최종 3 x 3 배열로 연산됩니다.
배열 | 0차원 | 1차원 |
---|---|---|
A | 3 | 1->3 |
B | 1->3 | 3 |
즉, 연산을 할 배열에서 크기가 1인 차원이 존재한다면 브로드캐스팅이 적용되어 다른 배열에서 해당 차원의 크기만큼 확장합니다.
그럼 오른쪽 코드의 주석을 참고하여 빈칸을 채우고 브로드캐스팅이 적용된 연산 결과를 확인해봅시다.
코드 풀이
import numpy as np
np.random.seed(42)
A = np.array([[2, 3], [6, 9], [1, 4]])
print(A)
### 0부터 5까지 정수 범위에서 아래 나오는 사이즈만큼 np.random.randint 함수를 사용하여 랜덤배열을 생성해봅시다.
# a. 1 x 2 모양의 배열
# b. 3 x 1 모양의 배열
# c. 1 x 1 모양의 배열
B = np.random.randint(0,5,size = (3,1))
print(B)
# A와 B 사이의 덧셈 연산 결과를 result에 담아주세요.
result = A + B
print(result)
[[2 3]
[6 9]
[1 4]]
[[3]
[4]
[2]]
[[ 5 6]
[10 13]
[ 3 6]]
'AI_Bootcamp' 카테고리의 다른 글
3주차 Day15 Numpy 실습 V (0) | 2022.01.21 |
---|---|
[MYSQL] INNER JOIN, LEFT JOIN 예제문제 (0) | 2022.01.21 |
Numpy 심화 실습 chap3 브로드캐스팅 (0) | 2022.01.20 |
3주차 Day14 Numpy 실습 IV (0) | 2022.01.20 |
Numpy 심화 실습 chap2 bool 인덱싱 (0) | 2022.01.19 |