관리 메뉴

개발자비행일지

Python @연산자, 벡터 행렬 곱연산 본문

▶ Python

Python @연산자, 벡터 행렬 곱연산

Cyber0946 2020. 7. 14. 15:37

파이썬의 Numpy, Tensorflow는 행렬 곱을 빠르게 계산할 수 있도록 함수를 지원한다. 하지만 두 실수의 곱연산과 달리 matrix의 곱연산은 교환법칙(commutative law)가 성립하지 않는다. 즉, 편리한 함수를 사용하더라도 인자(argument)의 순서를 틀리면 잘못된 결과를 얻게된다.

본 포스트에서는 Python에서 흔히 사용되는 행렬 곱연산에 대하여 간단한 설명 및 예제를 정리해 보자 .

아래의 표는 Python으로 가능한 행렬 연산을 정리한 것이며, 계산할 때는 bold체로 표시된 함수를 사용한다.

Function

Matrix shape

Description

numpy * operator

(n,m) (n,m) = (n,m)

element-wise

numpy.dot

(n,p) (p,m) = (n,m)

A: 2x3
B: 3x4
np.dot(A,B): 2x4

numpy.matmul
numpy @ operator

(n,p) (p,m) = (n,m)

A: 2x3
B: 3x4
A@B: 2x4

 

목차
1. numpy * operator
2. numpy.dot
3. numpy.matmul
Reference

 

1. numpy * operator (asterisk)

'별 연산자' 또는 '애스터리스크'라고 불리는 곱연산에 대하여 살펴보자. 이 연산자는 형태(shape)가 동일한 두 행렬을 원소끼리(element-wise) 곱하는 연산자이다.

다음의 예제는 2x3 행렬과 3x2에 대한 * 사용 예이다.

행렬의 크기가 동일하면 * 연산자는 원소끼리 곱하기를 계산한다.

>>> B.T array([[-3, -1, 1], [-2, 0, 2]]) >>> A * B.T array([[ 0, -1, 2], [-6, 0, 10]])

애스터리스크 연산자는 element-wise이므로 교환법칙이 성립한다.

2. numpy.dot

두 벡터(vector)의 내적, 내적곱, 점곱 등을 계산하는 함수이다. 행렬곱에서도 사용가능하지만, 그러한 경우 공식문서에서는 numpy.matmul 사용을 권장한다[1]. 어쨌든 두 행렬의 곱을 numpy.dot으로 계산하려면, 첫번째 행렬의 열크기(column)와 두번째 행렬의 행크기(row)가 서로 같아야한다.

다음의 예제는 2x3 행렬과 3x4에 대한 np.dot 사용 예이다.

A.shape[1]과 B.shape[0]이 동일하므로 dot 연산이 가능하다. 다음의 두 dot 연산은 서로 같은 결과를 보여준다.

선형대수학에서 배웠듯이 행렬의 내적은 교환법칙이 성립하지 않는다.

3. numpy.matmul (@ operator)

행렬의 곱연산을 위해 정의된 함수이다. numpy dot과 비슷해보이지만, 3차원 이상의 행렬곱을 계산하는 방식이 서로 다르다[2]. numpy matmul은 애스터리스크 연산자처럼 골뱅이(?) 연산자로 쉽게 사용할 수 있다.

2차원 행렬의 곱연산에서는 matmul, dot, @가 모두 같은 결과를 보여준다.

matmul과 dot의 큰 차이점은 2가지다. 첫번째는 차이로, dot는 행렬과 상수(constant)의 곱셈을 허용하지만, matmul은 Error를 일으킨다.

두번째 차이는, 3차원 이상의 행렬곱(Tensor multiplication)을 수행할 경우, dot와 matmul은 전혀 다른 결과를 낸다. (텐서곱에 대한 내용은 [3]을 참고한다.)

 

Reference

[1] https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html
[2] https://docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html
[3] https://blog.naver.com/cjh226/221356884894

[4] http://blog.naver.com/PostView.nhn blogId=cjh226&logNo=221356199190&redirect=Dlog&widgetTypeCall=true&directAccess=false

 

Python 벡터 행렬 곱연산

파이썬의 Numpy, Tensorflow는 행렬 곱을 빠르게 계산할 수 있도록 함수를 지원한다. 하지만 두 실수의 ...

blog.naver.com