목표
차원이 다른 배열들 간의 연산을 할 때 브로드캐스팅이 어떻게 적용되는지 살펴봅시다.
차원이 다른 배열 간의 연산
다른 차원의 배열들 간의 연산을 해봅시다. 예시로 2 x 1 x 3 모양을 가진 3차원 배열(A)과 2 x 3 모양을 가진 2차원 배열(B) 사이에 덧셈 연산, 그리고 배열(A)과 1 x 2 모양을 가진 2차원의 배열(C) 사이에 덧셈 연산을 하는 코드를 살펴보겠습니다.
import numpy as np
# 2 x 1 x 3 모양의 배열 A
A = np.array(
[[[3, 2, 1]],
[[0, 1, 3]]]
)
# 2 x 3 모양의 배열 B
B = np.array(
[[0, 2, 1],
[2, 2, 3]]
)
# 2 모양의 배열 C
C = np.array([[1, 2]])
result = A + B
print(result)
[[[3 4 2]
[5 4 4]]
[[0 3 4]
[2 3 6]]]
위 코드에서 A + B를 행하는 연산을 그림으로 나타내면 다음과 같습니다.
a. 2 x 3 모양을 가진 2차원 배열 B는 0차원의 크기가 2, 1차원의 크기가 3입니다. 그러나 2 x 1 x 3 모양을 가진 3차원의 배열 A에 맞춰 3차원으로 확장되면 0차원에는 배열 A의 0차원 크기인 2가 되고, 1차원에는 기존 배열의 0차원 크기(2)가, 2차원에는 기존 배열의 1차원 크기(3)가 됩니다.
배열 | 0차원 | 1차원 | 2차원 |
---|---|---|---|
A | 2 | 1 | 3 |
기존 B | 2 | 3 | x |
확장된 B | 2 | 2 | 3 |
b. 그리고 앞선 실습에서 확인했던 것처럼 배열 A의 1차원의 크기가 1이므로 배열 B의 1차원의 크기에 맞춰 2로 확장됩니다.
배열 | 0차원 | 1차원 | 2차원 |
---|---|---|---|
A | 2 | 1->2 | 3 |
B | 2 | 2 | 3 |
그러나 A + C의 경우 브로드캐스팅이 적용되지 않는다고 에러가 발생합니다. 이는 브로드캐스팅이 적용될 때 마지막 차원부터 맞춰지기 때문입니다. 즉, 배열 A의 2차원의 크기인 3과 C의 1차원의 크기인 2가 맞지 않아 발생한 것입니다.
정리하면 배열 간 연산에서 서로 차원이 맞지 않더라도 A + B와 같이 뒤에서부터 차원의 짝이 일치하면 브로드캐스팅이 적용됩니다.
그럼 오른쪽 코드의 주석을 참고하여 빈칸을 채우고 브로드캐스팅이 적용된 연산 결과를 확인해봅시다.
문제풀이
import numpy as np
np.random.seed(42)
# 2 x 1 x 3 모양의 배열 A
A = np.array(
[[[4, 3, 1]],
[[3, 2, 2]]]
)
print(A)
### np.random.randint 함수를 사용하여 아래 주어진 크기의 랜덤 배열을 생성해 봅시다. 단, 정수 범위는 0부터 5까지로 지정합니다.
# a. 1 x 3 모양의 배열
# b. 3 모양의 배열
# c. 2 x 3 모양의 배열
B = np.random.randint(0,5,size=(2,3))
print(B)
# A와 B 사이의 덧셈 연산 결과를 result에 담아주세요.
result = A+B
print(result)
[[[4 3 1]]
[[3 2 2]]]
[[3 4 2]
[4 4 1]]
[[[7 7 3]
[8 7 2]]
[[6 6 4]
[7 6 3]]]
'AI_Bootcamp' 카테고리의 다른 글
4주차 Day16 Numpy 심화 실습 2 (0) | 2022.01.24 |
---|---|
4주차 Day16 Numpy 심화 실습 1 (0) | 2022.01.24 |
Numpy 심화 실습 chap6 any(),all() (0) | 2022.01.21 |
3주차 Day15 Numpy 실습 V (0) | 2022.01.21 |
[MYSQL] INNER JOIN, LEFT JOIN 예제문제 (0) | 2022.01.21 |