티스토리 뷰

ndarray의 사칙연산, 행렬곱, Broadcasting

  • 사칙연산 : +, -, *, /
  • 행렬곱 : dot product
  • Broadcasting은 사칙연산에서만 일어나고, dot product에서는 일어나지 않는다!

1. 행렬 덧셈

  • python의 list에서, + 연산자는 concatenation!!
  • ndarray에서 + 연산자는 vector, matrix 연산
  • ndarray의 사칙연산의 기본 전제는 shape이 같아야 연산이 성립
import numpy as np

arr1 = np.array([[1, 2, 3], [4, 5, 6]])     # 2 x 3 ndarray
arr2 = np.array([[7, 8, 9], [10, 11, 12]])  # 2 x 3 ndarray
print(arr1)
print(arr2)

print(arr1 + arr2)                          # ndarray의 기본 연산 방식

행렬 덧셈의 Broadcasting

# arr1 = [[1 2 3]
#         [4 5 6]]
arr2 = 3   # scalar는 값을 칭한다.
           # shape이 안맞는 경우, ndarray가 broadcasting을 진행
print(arr1 + arr2)           # [[4 5 6]
                            # [7 8 9]]

arr2 = np.array([1, 2, 3]) # broadcasting
print(arr1 + arr2)           # [[2 4 6]
                           # [5 7 9]]

# arr2 = np.array([1, 2]) --broadcasting X---> [1, 2, 1, 2]

2. 행렬 곱 연산

두 행렬간의 행렬곱은 np.dot(), np.matmul()로 수행이 가능하다.

np.dot(A, B)

  • np.dot(A, B)에서 A 행렬의 열 vecotr와, B 행렬의 행 vecotr의 size가 같아야 한다.
  • 만약 크기가 다르다면, reshape()이나 resize() .. 등으로 크기를 맞춘 후 연산을 수행해야 한다.
arr1 = np.array([[1, 2, 3], [4, 5, 6]]) 
arr2 = np.array([[7, 8],[9, 10], [11, 12]]) 
print(arr1.shape)           # (2, 3)    
print(arr2.shape)            # (3, 2)

print(np.dot(arr1, arr2))   # [[ 58  64]
                            # [139 154]]
  • 왜 이런 행렬곱 연산을 알아야 하나요?
    • 만약 행렬곱 연산이 없으면 matrix 연산은 같은 크기로만 연산을 수행해야 한다.
    • 행렬곱 조건만 만족시키면 다양한 크기의 행렬을 우리가 연속적으로 이용해서 특정 작업을 수행할 수 있다
    • 머신러닝, 이미지처리 쪽에서 사용된다.
      • 예) 입력 : 32 x 32 matrix (이미지파일)
      • 출력 : 32 x 10 matrix (다양한 처리가 적용된 이미지)
      • 행렬곱 : (32 x 32) dot (32 x 128) dot (128 x 64) dot (64 x 10)
        • => 32 x 10

ndarray의 비교연산

사칙연산과 마찬가지로 비교연산도 같은 index끼리 수행된다.

np.random.seed(0)
arr1 = np.random.randint(0, 10, (2, 3))
arr2 = np.random.randint(0, 10, (2, 3))
print(arr1)
print(arr2)

print(arr1 == arr2)     # Boolean Mask 출력
# [[False False False]
#  [False  True False]]

array_equal()

2개의 ndarray가 같은 데이터를 가지고 있는지 비교할 때 => array_equal()

arr1 = np.arange(10)
arr2 = np.arange(10)

print(arr1)
print(arr2)
print(np.array_equal(arr1, arr2))     # True
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함