JLOG

[Python]np.dot과 np.matmul의 차이 본문

Python/함수

[Python]np.dot과 np.matmul의 차이

정정선선 2021. 3. 7. 23:14

np.dot

참고 사이트 : https://numpy.org/devdocs/reference/generated/numpy.dot.html

1D의 경우 내적

2D의 경우 행렬 곱 (np.matmul 사용을 권장)

nD의 경우 첫번째 행렬의 마지막 axis와, 두번째 행렬의 뒤에서 2번째 axis과의 내적으로 계산된다.

dot(a, b)[i,j,k,m] = np.sum(a[i,j,:] * b[k,:,m])

 

 

np.matmul

참고 사이트 : https://numpy.org/doc/stable/reference/generated/numpy.matmul.html

2D의 경우 기존 행렬 곱

두 인수 중 하나가 nD의 경우(n>2), 마지막 두개의 축으로 이루어진 행렬을 나머지 축에 따라 쌓아 놓은 것이라고 생각한다.

즉, 마지막 두개의 행렬을 제외한 행렬의 크기가 일치하여야 한다.

C[i,j,k] = np.sum(A[i,j,:] * B[i,:,k])

 

주의) 행렬과 스칼라끼리의 곱 연산이 안됨(대신 *를 사용)

 

 

 

 

np.dot과 np.multiply의 차이 예제

2D 행렬 연산일 경우 동일한 결과가 나온다.

nD(n>2)인 경우 아래와 같이 다른 결과가 나옴으로 유의하여 사용해야 한다.

 

>>> a = np.ones([9, 5, 7, 4]) 
>>> c = np.ones([9, 5, 4, 3])
>>> np.dot(a, c).shape
(9, 5, 7, 9, 5, 3)

>>> np.matmul(a, c).shape
(9, 5, 7, 3)

# n is 7, k is 4, m is 3

 

 

참고 블로그 : https://blog.naver.com/cjh226/221356884894

 

numpy에서 dot과 matmul의 차이

이전 포스트에서 python의 여러가지 행렬곱(matrix multiplication)을 살펴보았다[1]. 신가하게도 행렬곱을...

blog.naver.com

위의 블로그 설명이 아주 기똥차고 자세하게 되어 있음으로 참고하는 것을 추천

 

Comments