numpy

배열끼리의 연산

siwoli 2022. 3. 27. 23:04

이전의 '배열의 연산'은 배열 내부의 값들을 계산하는 것을 다루었다.

이번에 다룰건 '배열끼리 연산'이다.


배열끼리의 사칙연산 

같은 구조의 배열끼리는 요소별 연산을 수행한다. 예시를 보면 다음과 같다.

x = np.arange(1,13).reshape(-1,3)
x

>array([[ 1, 2, 3],

          [ 4, 5, 6],

          [ 7, 8, 9],

          [10, 11, 12]])

print(x+x)

print(x-x)

print(x * x)

print(x / x)

print(x ** x) # 거듭제곱

>[[ 2 4 6]

   [ 8 10 12]

   [14 16 18]

   [20 22 24]]

 

  [[0 0 0]

   [0 0 0]

   [0 0 0]

   [0 0 0]]

 

  [[ 1 4 9]

   [ 16 25 36]

   [ 49 64 81]

   [100 121 144]]

 

  [[1. 1. 1.]

   [1. 1. 1.]

   [1. 1. 1.]

   [1. 1. 1.]]

 

  [[ 1 4 27]

   [ 256 3125 46656]

   [ 823543 16777216 387420489]

   [ 10000000000 285311670611 8916100448256]]


배열끼리 내적

np.dot(a, b) 또는 a.dot(b)

[ m X n ]•[ n X k ] = [ m X k ] --> 앞 벡터의 열= 뒤 벡터의 행일때 내적이 가능하다.

x_1 = np.arange(1,9).reshape(-1,4)
x_2 = np.arange(2,10).reshape(-1,2)
x_1.dot(x_2)

>array([[ 60, 70],

          [140, 166]])

위의 x_1은 [2 x 4] 행렬이고 x_2는 [4 x 2] 행렬이므로 내적할 수 있다.


broadcasting 연산

배열의 구조가 다른 배열 간의 연산으로,
하나의 행렬과 스칼라 값들 간의 연산이나 행렬과 벡터, 벡터와 벡터간의 연산에서 발생한다.

방송국의 전파 처럼 계산이 퍼지는 형태여서 broadcasting이라고 부른다.

 

단순히 행렬에 스칼라 값을 연산하면 행렬의 각 요쇼에 스칼라 값이 연산되는 형태다.

행렬과 벡터, 벡터와 벡터간 연산은 각각의 모자란 행과 열이 있다면 값을 복제하여 계산한다.

arrx = np.arange(1,13).reshape(-1,3)
arry = np.arange(10,40,10)
print(arrx)
print()
print(arry)

>[[ 1 2 3]

   [ 4 5 6]

   [ 7 8 9]

   [10 11 12]]

 

   [10 20 30]

arrx + arry

>array([[11, 22, 33],

          [14, 25, 36],

          [17, 28, 39],

          [20, 31, 42]])

 

여기서 행벡터 arry가 arrx행렬의 행 개수에 맞게 복제되어 연산했다고 생각하면 된다.

브로드캐스팅 연산은 서로 다른 크기의 행렬간에 연산을 가능하게하므로

회귀모델에서 비용함수를 구현할때 적용된다.