ㅅㅇ

numpy _ 04_3 브로드캐스팅 본문

AI_STUDY/Numpy

numpy _ 04_3 브로드캐스팅

SO__OS 2022. 6. 24. 00:27
플레이데이터 빅데이터캠프 공부 내용 _ 6/23

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