선형대수학을 공부하면서 컴퓨터로는 벡터와 행렬의 곱셈 연산을 어떻게 하는지 궁금해하던 기억이 있습니다.
이번 포스팅에서는 벡터의 내적과 행렬의 곱셈 관련 API에 대해 알아보겠습니다.
import numpy as np
벡터의 내적
np.dot(a, b, out=None)
u = np.random.uniform(0, 5, (4, ))
v = np.random.uniform(0, 5, (4, ))
vec_sum = np.sum(u * v)
print(vec_sum.round(2))
# 56.47
vec_sum_dotprod = np.dot(u, v)
print(vec_sum_dotprod.round(2))
# 56.47
np.dot() 메서드를 사용해서 벡터의 내적을 구할 수 있습니다.
매개변수로 전달하는 두 벡터 a, b의 형태(shape)는 같아야 합니다.
행렬의 곱셈
np.matmul(shape, dtype=float, order='C', *, like=None)
행렬 * 벡터
M = np.random.randint(0, 5, (3, 4))
u = np.random.randint(0, 5, (4, ))
print(M)
# [[3 3 4 0]
# [3 4 0 4]
# [4 0 4 1]]
print(u)
# [0 3 2 2]
np_matvec_mul = np.matmul(M, u)
print(np_matvec_mul)
# [17 20 10]
np.matmul() 메서드를 사용하면 벡터와 행렬을 곱할 수 있습니다.
곱셈이 성립하는 조건에 대해서는 따로 언급하지 않겠습니다.
사실 np.dot() 메서드를 똑같이 사용해서 벡터와 행렬을 곱할 수 있습니다.
하지만 의미상으로 행렬을 곱하는 것이기 때문에 np.matmul() 메서드를 사용합니다.
행렬 * 행렬
M = np.random.randint(0, 5, (3, 4))
N = np.random.randint(0, 5, (4, 5))
print(M)
# [[4 2 4 4]
# [4 3 3 3]
# [2 3 0 4]]
print(N)
# [[3 2 0 2 1]
# [4 1 4 0 1]
# [1 3 1 0 4]
# [1 2 0 0 3]]
np_mat_mul = np.matmul(M, N)
print(np_mat_mul)
# [[28 30 12 8 34]
# [30 26 15 8 28]
# [22 15 12 4 17]]
맞닿는 차원의 길이가 동일하다면 행렬과 행렬 또한 곱할 수 있습니다.
정리를 마치며
이상으로 딥러닝 코드를 작성할 때 많이 사용하는 np.dot(), np.matmul() 메서드의 기본적인 사용법에 대해 알아봤습니다.
'파이썬・ML > numpy' 카테고리의 다른 글
넘파이 np.repeat(), np.tile() 배열 반복하기 (0) | 2023.06.16 |
---|---|
넘파이 np.hstack(), np.vstack(), np.concatenate() 배열 합치기 (0) | 2023.06.16 |
넘파이 배열의 차원 다루기 (0) | 2023.06.15 |
넘파이 정렬 메서드 알아보기 (0) | 2023.06.14 |
넘파이 반올림 메서드 알아보기 (0) | 2023.06.14 |