행렬 (덧셈, 뺄셈, 곱셈). Broadcasting.

목록


1
import numpy as np

1. 행렬 - 덧셈

행렬의 shape이 같아야 덧셈 가능

1-1. 덧셈

1
2
a = np.array([[1, 2, 3],
[2, 3, 4]])
1
2
b = np.array([[3, 4, 5],
[1, 2, 3]])
1
a + b
array([[4, 6, 8],
       [3, 5, 7]])

1
2
a = np.array([[1, 2, 3],
[2, 3, 4]])
1
2
3
b = np.array([[1, 2],
[3, 4],
[5, 6]])
1
a + b    # shape이 다르면 error발생
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-7-37f7d36ad418> in <module>
----> 1 a + b    # shape이 다르면 error발생


ValueError: operands could not be broadcast together with shapes (2,3) (3,2) 

1-2. Sum – Matrix안의 계산

명령어: np.sum(‘array_name’, axis = ‘0/1/…’)

주의: 계산할 때 axis의 방향대로 Sum을 구한다.

예를 들면, 2darray에서,

  • axis = 0 이면: 수직방향으로 Sum을 구한다

  • axis = 1 이면: 수평방향으로 Sum을 구한다


1
2
a = np.array([[1, 2, 3],
[2, 3, 4]])
1
np.sum(a, axis = 0)
array([3, 5, 7])

1
np.sum(a, axis = 1)
array([6, 9])


2. 행렬 - 뺄셈

1
2
a = np.array([[1, 2, 3],
[2, 3, 4]])
1
2
b = np.array([[3, 4, 5],
[1, 2, 3]])
1
a - b
array([[-2, -2, -2],
       [ 1,  1,  1]])

1
2
a = np.array([[1, 2, 3],
[2, 3, 4]])
1
2
3
b = np.array([[1, 2],
[3, 4],
[5, 6]])
1
a - b    # shape이 다르면 error발생
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-18-e62ba154daaa> in <module>
----> 1 a - b    # shape이 다르면 error발생


ValueError: operands could not be broadcast together with shapes (2,3) (3,2) 


3. 행렬 - 곱셈

3-1. 일반 곱셈

일반곱셈은 덧셈과 뺏셈이랑 동일하게 같은 위치에 있는 애들끼리 곱한다.
[shape이 완전 같아야 함]

1
2
a = np.array([[1, 2, 3],
[2, 3, 4]])
1
2
b = np.array([[3, 4, 5],
[1, 2, 3]])
1
a * b
array([[ 3,  8, 15],
       [ 2,  6, 12]])

3-2. dot product / 내적곱

[맞닿는 shape이 같아야 함]

1
2
a = np.array([[1, 2, 3],
[2, 3, 4]])
1
2
3
b = np.array([[1, 2],
[3, 4],
[5, 6]])
1
a.shape, b.shape
((2, 3), (3, 2))

방법 1: np.dot(a, b)

1
np.dot(a, b)
array([[22, 28],
       [31, 40]])

방법2: a.dot(b)

1
a.dot(b)
array([[22, 28],
       [31, 40]])


4. Broadcasting

4-1. 숫자의 연산

array a 의 모든 원소에 3을 더하고 싶다면:

  • 단순히 행렬 덧셈을 사용할 때:
1
2
a = np.array([[1, 2, 3],
[2, 3, 4]])
1
2
b = np.array([[3, 3, 3],
[3, 3, 3]])
1
a + b
array([[4, 5, 6],
       [5, 6, 7]])

  • Broadcasting 사용할 때:
1
2
a = np.array([[1, 2, 3],
[2, 3, 4]])
1
a + 3
array([[4, 5, 6],
       [5, 6, 7]])

1
a - 3
array([[-2, -1,  0],
       [-1,  0,  1]])

1
a * 3
array([[ 3,  6,  9],
       [ 6,  9, 12]])

1
a / 3
array([[0.33333333, 0.66666667, 1.        ],
       [0.66666667, 1.        , 1.33333333]])


4-2. array (배열)의 broadcasting

original array의 shape이 유지됨.

1
2
a = np.array([[1, 2, 3],
[2, 3, 4]])
1
2
b = np.array([[1],
[2]])
1
a.shape, b.shape
((2, 3), (2, 1))
1
a * b
array([[1, 2, 3],
       [4, 6, 8]])

1
2
a = np.array([[1, 2, 3],
[2, 3, 4]])
1
b = np.array([1, 2, 3])
1
a * b
array([[ 1,  4,  9],
       [ 2,  6, 12]])