일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 파이썬 채팅
- 파이썬 엑셀 파일 읽고 쓰기
- ROS #spin() #spinOnce() #ROS기초
- 논문번역 꿀팁
- pdf 번역
- 파이썬 프로젝트
- 파이썬 예시
- 파파고 번역
- 파이썬 유튜브
- 패스트 캠퍼스 #자율주행 #비전
- 파이썬 음성파일 텍스트 변환
- 파이썬 #
- 파이썬 텍스트 변환 #파이썬 공부
- 파이썬
- 파이썬 파일 전송
- 크롬오류#크롬검색어자동완성끄기#검색어자동완성오류#검색어자동완성 제거#검색어 노란선#검색어반복입력
- 파이썬 열
- 통계 #ROC #TPR #FPR #TNR #이진분류 #Accuracy #Recall
- 파파고 꿀팁
- 리눅스#모의해킹#리눅스명령어#head 명령어
- QGC#QGrouncControl#GLIB오류
- 리눅스기초#리눅스명령어#리눅스 tail#tail#모의해킹 리눅스
- 파이썬#파이썬경로#파이썬폴더#파이썬디렉토리
- 파이썬#subprocess#communicate()
- 스트림 암호 one-time-pad 공격#보안#암호
- PDF 개행문자
- 파이썬 음성인식
- ROS #Robotics #ROS기초
- 파이썬 #파이썬프로젝트 #파이썬 예시 #파이썬 파일경로 #파이썬 자동화
- 파이선 행
개발자비행일지
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' 카테고리의 다른 글
파이썬 OS 모듈, 디렉토리 위치 얻기 (0) | 2020.07.15 |
---|---|
파이썬, 몬테카를로 시뮬레이션 (0) | 2020.07.15 |
파이썬 딕셔너리 (0) | 2020.07.10 |
파이썬 os모듈 사용법 (0) | 2020.07.10 |
파이썬으로 pdf 파일 제목 추출하기 (0) | 2020.07.10 |