| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
- BCI
- 가진진동수
- ALS
- 리스트 곱하기
- 파이썬 음성인식
- 자폭드론
- 토마슐로 알고리즘
- HBM 대역폭
- 레인보우로보틱스
- 확률과 통계
- 공진 현상
- 샤헤드136
- llm 보안
- 독립 동일 분포
- 프롬프트 인젝션
- 파이썬 리스트 연산
- 계층적 군집
- 컴퓨터구조
- 파이썬
- confused deputy
- 파이썬 프로젝트
- 뉴럴링크
- 중심극한정리`
- 드론 진동
- defense AI
- ARKQ
- `iid
- GDDR HBM 차이
- 와이브레인
- i.i.d
개발자비행일지
Python @연산자, 벡터 행렬 곱연산 본문
파이썬의 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 |
|
numpy.matmul |
(n,p) (p,m) = (n,m) |
A: 2x3 |
목차
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
Python 벡터 행렬 곱연산
파이썬의 Numpy, Tensorflow는 행렬 곱을 빠르게 계산할 수 있도록 함수를 지원한다. 하지만 두 실수의 ...
blog.naver.com
'▶ Python' 카테고리의 다른 글
| 파이썬 OS 모듈, 디렉토리 위치 얻기 (0) | 2020.07.15 |
|---|---|
| 파이썬, 몬테카를로 시뮬레이션 (0) | 2020.07.15 |
| 파이썬 딕셔너리 (0) | 2020.07.10 |
| 파이썬 os모듈 사용법 (0) | 2020.07.10 |
| 파이썬으로 pdf 파일 제목 추출하기 (0) | 2020.07.10 |