ㅅㅇ
numpy _ 04_3 브로드캐스팅 본문
numpy _ 04_3 브로드캐스팅
기본적으로, 배열의 연산은 shape이 다르면 error
근데, shape이 다른 애들끼리 연산이 되기 위해
넘파이에서 알아서 shape을 맞춰주는 브로드캐스팅이 있다.
그러나, 다 되는 것은 아니다.
우리는 브로드캐스팅이 가능한 조건을 알아야 한다.
그리고 어떤 식으로 변형이 되고 값이 나올지 알고 있어야 한다.
1. 브로드캐스팅 이란
- 사전적의미 : 퍼트린다. 전파한다.
- 형태(shape)가 다른 배열 연산시, 배열의 형태를 맞춰 연산이 가능하도록 한다.
- 모든 형태를 다 맞추는 것은 아니고 조건이 맞아야 한다.
- 조건
1. 두 배열의 축의 개수가 다르면(차원이 다르면),
작은 축의개수를 가진 배열의 형태(shape)의 앞쪽을 1로 채운다.
- 차원을 늘릴 땐, 무조건 앞쪽 축만 늘릴 수 있다.!
- (2, 3) + (3, ) => (2, 3) + (1, 3)
- (2, 3) + (2,) 는 안됨.
2. 두 배열의 차원 수가 같지만 각 차원의 크기가 다른 경우,
어느 한 쪽에 1이 있으면 그 1이 다른 배열의 크기와 일치하도록 늘어난다.
- 1 이외의 나머지 축의 크기는 같아야 한다.
- 늘리면서 원소는 복사한다.
- (2, 3) + (1, 3) => (2, 3) + (2, 3)
- (5, 1) + (1, 5) => (5, 5) + (5, 5)
- (3, 1, 2) + (3, 5, 2) => (3, 5, 2) + (3, 5, 2)
- (3, 1, 2) + (2, 2, 1) => 안됨. (0번 축 때문에)
- 배열의 형태를 맞출 때
1) 배열과 스칼라 연산 또한 사실은 브로드캐스팅이다.
- shape(2,3) 배열과 스칼라 5 의 연산
x = np.array([[1,2,4],[1,3,5]])
print(np.shape(x), np.shape(5))
(2, 3) ()
- - > 스칼라를 2차원으로 만든다. : shape (1, 1) [ [ 5 ] ]
- - > shape 를 맞춘다. (1, 1) 이니 맞출 수 있다. : shape (2,3) [[5,5,5], [5,5,5]
r = x + 5
print(np.shape(r))
r
(2, 3)
array([[ 6, 7, 9],
[ 6, 8, 10]])
2) 브로드캐스팅 조건
- (2, 2, 3, 4) (3, 4) -- > 연산 가능.
x = np.arange(2*2*3*4).reshape(2,2,3,4)
y = np.arange(12).reshape(3,4)
print(x.shape, y.shape)
x + y
3) 브로드캐스팅이 되지 않는 조건
- 두 배열의 차원 수가 같지만, 각 차원의 크기가 다른 경우, 늘려야 할 축의 size가 1이 아니기 때문에
# ValueError : operands could not be broadcast together with shapes (3,) (2,)
x = np.array([1,2,3]) # (3,)
y = np.array([1,2]) # (2,)
x + y
- 두 배열의 차원 수가 다를 때 차원을 늘리는데, 이때 무조건 앞쪽 축만 늘릴 수 있다.
(2, 3) + (2, ) 는 axis 1 을 만들어 차원을 맞춰줄 수 있을 것 같지만,
(2, 3) (1, 2) 로 늘려야 할 축의 size가 1이 아니라면 브로드캐스팅 할 수 없음.
# ValueError: operands could not be broadcast together with shapes (2,3) (2,)
# (2, 3) (2,)
x = np.arange(6).reshape(2,3)
z = np.arange(2)
x + z
- (2, 2, 3, 4) (2, 2) -- > 불가능
x = np.arange(2*2*3*4).reshape(2,2,3,4)
y = np.arange(4).reshape(2,2)
- 원소가 하나에서 동일값을 복사하여 늘리는 거면
배수로 복사하면 되지 않을까하지만, 하나가 아닌 두 행, 열 ... 은 복사가 안된다.
ValueError: operands could not be broadcast together with shapes (3,2) (6,2)
a = np.arange(6).reshape(3,2)
b = np.arange(12).reshape(6,2)
print(a.shape,b.shape)
a+b
'AI_STUDY > Numpy' 카테고리의 다른 글
numpy _ 04_2 범용함수(Ufunc, Universal function) (0) | 2022.06.24 |
---|---|
numpy _ 04_1 벡터 연산 (0) | 2022.06.24 |
numpy _ 02_2 정렬 (0) | 2022.06.24 |
numpy _ 02_1 배열의 원소 조회 (0) | 2022.06.24 |
numpy _ 01_2 배열 생성 (0) | 2022.06.23 |