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 |