활연개랑

[numpy(넘파이)] 행렬곱(내적), 역행렬 구하기 (+ 역행렬 검증하기) 본문

Python

[numpy(넘파이)] 행렬곱(내적), 역행렬 구하기 (+ 역행렬 검증하기)

승해tmdhey 2021. 7. 29. 21:57
반응형

 

내적: 행렬곱

 

행렬곱은 아래와 같은 형식을 사용합니다.

np.dot(x,y)

# x.dot(y) 를 사용해도 된다.

x와 y에는 행렬이 들어가야만 행렬 곱을 할 수 있습니다.

 

다음과 같이 행렬을 지정해줍시다. 

import numpy as np

x= np.arange(1,7).reshape(2,3)   # 1,6까지 2행3열
y= np.array([[6,23],[-1,7],[8,9]])   # 2개의 배열 3개를 2행3열로 만들기

그리고 행렬곱을 실행해줍니다. 

np.dot(x,y)

 

결과는 다음과 같이 나옵니다.

array([[ 28,  64],
       [ 67, 181]])

 

 

 

역행렬

역행렬은 아래와 같은 코드를 사용합니다.

np.linalg.inv()

 

일단 역행렬을 하기위해 행렬을 하나 만들어줍니다.

np.random.seed(0)   # 랜덤으로 뽑은 수 고정시키기

mt1= np.random.randint(1,4,size=(3,3))   # 1~3의 수 중에서 9개를 뽑아 3행 3열로 만들기

 

행렬을 만든 후에 역행렬 코드를 실행시켜주면 됩니다.

mt2= np.linalg.inv(mt1)  
mt2

 

결과는 아래와 같이 나옵니다.

array([[ 7., -1., -4.],
       [-1.,  0.,  1.],
       [-4.,  1.,  2.]])

 

 

############# 

한가지 알아두어야 할 점은 np.random.seed(0)  를 하지 않거나, np.random.seed(1)로 지정해주게되면 

값은 거의 같지만 값이 조금 더 복잡하게 나오게 됩니다. 

아래는 똑같은 코드를 np.random.seed(1)을 했을 경우의 값입니다.

np.random.seed(1)

mt1= np.random.randint(1,4,size=(3,3))

mt2= np.linalg.inv(mt1)
mt2
array([[-1.11022302e-16,  1.00000000e+00, -1.00000000e+00],
       [-1.00000000e+00,  1.00000000e+00,  0.00000000e+00],
       [ 2.00000000e+00, -3.00000000e+00,  2.00000000e+00]])

정확한 값은 위와 같습니다. 하지만 저는 값을 조금 더 깔끔하게 사용하기 위해 np.random.seed(0)을 사용합니다.

즉 np.random.seed(0)을 하면 근사값 정수가 나오게 됩니다.

 

###############

 

 

 

역행렬 검증하기 

역행렬을 만들기위해 만들어둔 mt1과 mt1을 역행렬로 만든 mt2가 있습니다. 

역행렬을 검증하기에 앞서, 다들 알다시피 행렬X와 행렬X의 역행렬을 내적할 경우에는 단위행렬이 나오게됩니다. 

 

즉, mt1과 mt1의 역행렬을 내적(행렬곱)을 할 경우 단위행렬이 나오게 된다는 의미입니다. 

단위행렬은 아래와 같습니다.

array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

 

그럼 mt2가 mt1의 역행렬이 맞는지 검증하기 위해서는 mt1과 mt2의 내적(행렬곱)을 구해보면 됩니다.

실행해보도록 하겠습니다.

np.dot(mt1,mt2)

결과:

array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

mt1과 mt2의 내적(행렬곱)이 단위행렬인 것을 보니 mt1과 mt2의 관계는 역행렬이 맞다는 것을 확인할 수 있습니다.