쫑쫑JJONG
끄적끄적 오후5시37분
쫑쫑JJONG
전체 방문자
오늘
어제
  • 분류 전체보기 (198)
    • Paper Reading (5)
    • Math (5)
    • Data Science (13)
      • SQL (12)
      • Data Analyst (1)
    • AI Track (32)
      • CV (21)
      • CV Remind (2)
      • NLP (1)
      • AI Basic (8)
    • Python (1)
      • Basic (8)
      • Application (5)
    • Robotics (31)
      • ROS (15)
      • Collabot_proj (16)
    • NaverBoost Camp 4기 (45)
      • 부스트일지 (13)
      • [P stage] Image Classificat.. (4)
      • [P stage] Object Detection (12)
      • [P stage] Semantic Segmenta.. (6)
      • [P stage] Final Project (5)
      • CV (1)
      • DL BASIC (4)
    • Excel (1)
    • Git (8)
      • Git (8)
    • Network (3)
      • 통신 (3)
    • 코테준비 (14)
      • Programmers (11)
      • 기타 (3)
    • 환경설정 (19)
    • etc (7)
      • 활동 (2)
      • TIP (3)
      • 잡동사니 (2)
    • 금융관련 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 포트폴리오

인기 글

태그

  • NLP
  • diffusion
  • error
  • Arduino
  • GIT
  • robotics
  • Confusion Matrix
  • 이고잉
  • python
  • ros
  • 논문분석
  • segmentation
  • mmdetection
  • SQL
  • collabot
  • CV
  • Monte Carlo Sampling
  • N
  • transformer
  • Data Scraping
  • 환경설정

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쫑쫑JJONG

끄적끄적 오후5시37분

[AI for Python] 행렬의 곱셈 정리
Python/Basic

[AI for Python] 행렬의 곱셈 정리

2022. 10. 4. 01:27
728x90

Python 에서의 행렬의  곱셈 종류

https://cyber0946.tistory.com/64

import numpy as np
A = np.array([[1,2,3],
              [4,5,6]])

B = np.array([[1,0],
              [1,0],
              [0,1]])
A@B 
#array([[3, 3],
#      [9, 6]])

1. numpy * operator (asterisk)

shape가 동일한 두행열의 원소끼리(element-wise) 곱하는 연산자

ex) A*B

import numpy as np
A = np.array([[1,2,3],
              [4,5,6]])

B = np.array([[2,2,2],
              [4,5,0]])
A*B

[11]
0초
import sympy as sym
from sympy.abc import x,y,z
from sympy.plotting import plot
[19]
0초
func =x**3 + 2*x**2 + 100
sym.poly(func)

[23]
0초
plot(func)

[21]
sym.diff(func) 

[27]
func =x**2 + 2*x + 100
val = func.subs(x,1) #103
104
[29]
0초
def func(val):
    fun = sym.poly(x**2 + 2*x + 3)
    return fun.subs(x,val), fun #x에 val를 넣은 값, fun 수식을 return
    
#ex) func(2)
print(func(2))
(11, Poly(x**2 + 2*x + 3, x, domain='ZZ'))
[42]
import numpy as np
V_A = np.array([1,2,4])
V_B = np.array([[4],[2],[1]])

A = np.array([[1,2,3],
              [4,5,6]])

B = np.array([[1,2],
              [1,2],
              [1,2]])
print(V_A.dot(V_B), "\n ------------------")
print(A.dot(B), "\n ------------------")
print(np.dot(A,B), "\n ------------------")
print(np.dot(B,A), "\n ------------------")
[12] 
 ------------------
[[ 6 12]
 [15 30]] 
 ------------------
[[ 6 12]
 [15 30]] 
 ------------------
[[ 9 12 15]
 [ 9 12 15]
 [ 9 12 15]] 
 ------------------
[45]
0초
import numpy as np
A = np.array([[1,2,3],
              [4,5,6]])

B = np.array([[2,2,2],
              [4,5,0]])
A*B
#array([[ 2,  4,  6],
#       [16, 25,  0]])

 

2. numpy.dot

두 벡터(vector)의 내적(내적곱, 점곱)을 계산하는 함수이다.

=> 행렬 일때는 numpy.matmul 사용을 권장

 

import numpy as np
V_A = np.array([1,2,4])
V_B = np.array([[4],[2],[1]])

A = np.array([[1,2,3],
              [4,5,6]])

B = np.array([[1,2],
              [1,2],
              [1,2]])
print(V_A.dot(V_B), "\n ------------------")
print(A.dot(B), "\n ------------------")
print(np.dot(A,B), "\n ------------------")
print(np.dot(B,A), "\n ------------------")

#[12] 
# ------------------
#[[ 6 12]
# [15 30]] 
# ------------------
#[[ 6 12]
# [15 30]] 
# ------------------
#[[ 9 12 15]
# [ 9 12 15]
# [ 9 12 15]] 
# ------------------

3. numpy.matmul (@ operator)

행렬의 곱연산을 위해 정의된 함수이다.

numpy dot과 비슷해보이지만, 3차원 이상의 행렬곱을 계산하는 방식이 서로 다르다

(만약 a가 N차원 배열이고 b가 2이상의 M차원 배열이라면,

dot(a,b)는 a의 마지막 축과 b의 뒤에서 두번째 축과의 내적으로 계산된다.)

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

numpy.dot : 두 배열의 내적곱(dot product)
numpy matmul : 두 배열의 행렬곱(matrix product)

 

배열 A의 차원이 (2,3,4)인 경우, matmul은 배열 A를 (3x4)행렬을 2개 갖고 있는 것으로 간주

배열 B의 차원이 (5,2,4,3)인 경우, (4x3)행렬을 (5x2)개수만큼 갖는다고 간주.

배열 C의 차원이 (1,5,3,2,4,6)이라고 한다면, (4x6)행렬을 (1x5x3x2)만큼 갖고 있다고 간주.

 

matmul(A,B)와 matmul(A,C) 결과의 차원은 각각 (5,2,3,3)과 (1,5,3,2,3,6)이 된다

 

즉, 다음 두 조건을 만족할때 error가 나지 않는다

1. 앞의 곱하는 녀석의 크기가 (n x m)  일때 뒤에 곱해지는 애가 (m x _ ) 이면 가능
2. 앞에 곱하는 녀석의 개수가 ( a x b) 일때 뒤에 곱해지는 애의 개수가 (_ x a x b) 이면 가능
import numpy as np
A = np.arange(2*3*4*5).reshape((5,2,3,4)) # 개수(5x2),크기 (4x3)
#B = np.arange(1*2*4*5*5*6).reshape((1,5,2,5,4,6)) # 개수 (1x5x2x5), 크기 (4x6) -> error
B = np.arange(1*2*4*5*5*6).reshape((1,5,5,2,4,6)) # 개수 (1x5x2x5), 크기 (4x6) -> ok
np.matmul(A,B).shape #(1, 5, 5, 2, 3, 6)

 

728x90
저작자표시 비영리 변경금지 (새창열림)

'Python > Basic' 카테고리의 다른 글

Python에서의 *args 와 **kwargs  (0) 2023.04.04
Python Decorator 에 관하여  (0) 2023.04.04
[Python Basic] Python 에 수식표현(Sympy)  (0) 2022.10.03
[Python Basic]조건문과 반복문  (0) 2022.09.23
[Python Basic]Function and print function formatting  (0) 2022.09.23
    'Python/Basic' 카테고리의 다른 글
    • Python에서의 *args 와 **kwargs
    • Python Decorator 에 관하여
    • [Python Basic] Python 에 수식표현(Sympy)
    • [Python Basic]조건문과 반복문
    쫑쫑JJONG
    쫑쫑JJONG
    connect : tmdwhd619@naver.com

    티스토리툴바