본문 바로가기

Python

numpy 행렬, 역행렬, 단위행렬 구하기 예제

반응형

예제) 행렬 만들기, 역행렬 만들기, '행렬과 역행렬의 곱 = 단위행렬' 검증


1. 역행렬 구하는 함수 - numpy.linalg.inv

x = np.random.randint(1, 10, size=(3, 3))
print(x)

y = np.linalg.inv(x)
print(y)

x @ np.linalg.inv(x)      # 행렬과 역행렬을 곱함 = 단위행렬(항등행렬)

 

결과

더보기
[[8 2 6]
 [5 7 5]
 [5 8 4]]
[[ 0.21428571 -0.71428571  0.57142857]
 [-0.08928571 -0.03571429  0.17857143]
 [-0.08928571  0.96428571 -0.82142857]]
array([[ 1.00000000e+00, -2.22044605e-16,  2.22044605e-16],
       [ 2.08166817e-16,  1.00000000e+00,  3.33066907e-16],
       [ 1.66533454e-16, -4.44089210e-16,  1.00000000e+00]])

2. 정방행렬(정사각형 단위행렬)만 단위행렬을 구할 수 있다. 

import numpy as np

# 정방행렬 생성. 정방행렬만 단위행렬을 구할 수 있음. 
x = np.random.randint(1, 10, size=(3, 3))
print("행렬 x:")
print(x)

# 역행렬 계산
y = np.linalg.inv(x)
print("행렬 y (x의 역행렬):")
print(y)

# 두 행렬의 곱 계산
result = np.dot(x, y)
print("두 행렬의 곱:")
print(result)

결과 

더보기

행렬 x:
[[6 3 9]
 [7 6 8]
 [3 8 7]]


행렬 y (x의 역행렬):
[[-0.16296296  0.37777778 -0.22222222]
 [-0.18518519  0.11111111  0.11111111]
 [ 0.28148148 -0.28888889  0.11111111]]


두 행렬의 곱:
[[ 1.00000000e+00 -1.11022302e-16  1.52655666e-16]
 [ 0.00000000e+00  1.00000000e+00  1.11022302e-16]
 [ 1.66533454e-16  1.11022302e-16  1.00000000e+00]]


3. np.matmul(x,y)는 행렬의 곱셈 구하는 함수다. x, y는 행렬이다. 

np.matmul(x,y)

결과 

더보기

array([[ 1.00000000e+00, -2.22044605e-16,  2.22044605e-16],
       [ 2.08166817e-16,  1.00000000e+00,  3.33066907e-16],
       [ 1.66533454e-16, -4.44089210e-16,  1.00000000e+00]])

 

4. 행렬과 역행렬의 곱이 단위행렬이라는 사실을 검증해보자. 

x = np.random.rand(3,3, 3)
print(x)

y = np.linalg.inv(x)
print(y)

결과

[[[0.72819666 0.31030457 0.6665688 ]
  [0.59708698 0.11677986 0.14714261]
  [0.03585474 0.57924096 0.05727763]]

 [[0.29904636 0.27617837 0.08568572]
  [0.22714867 0.56424405 0.06569428]
  [0.18690973 0.86974536 0.6353435 ]]

 [[0.77570816 0.50854745 0.00103691]
  [0.74478101 0.06017725 0.85699822]
  [0.05351685 0.47722555 0.62830611]]]
  
  
[[[-4.86096527e-01  2.27959314e+00 -1.99178919e-01]
  [-1.79010121e-01  1.10224203e-01  1.80007245e+00]
  [ 2.11459271e+00 -2.54166589e+00 -6.20384986e-01]]

 [[ 4.89656621e+00 -1.64019726e+00 -4.90780577e-01]
  [-2.14545282e+00  2.82697363e+00 -2.96109264e-03]
  [ 1.49648462e+00 -3.38742485e+00  1.72238648e+00]]

 [[ 7.39081433e-01  6.35253515e-01 -8.67694083e-01]
  [ 8.40463776e-01 -9.70370555e-01  1.32218092e+00]
  [-7.01320738e-01  6.82929635e-01  6.61234588e-01]]]

np.matmul(x,y)
x @ np.linalg.inv(x)  
# 둘다 행렬을 곱하는 함수.

결과 : 주 대각선이 1이 나오는 것을 확인할 수 있다. 행렬과 역행렬의 곱은 단위행렬이다. 

array([[[ 1.00000000e+00,  1.19884383e-16, -7.17840702e-17],
        [-1.40518580e-16,  1.00000000e+00, -7.07869813e-17],
        [-1.60808076e-17, -1.64861074e-17,  1.00000000e+00]],

       [[ 1.00000000e+00, -1.90556964e-17,  3.97734187e-17],
        [-2.81526510e-17,  1.00000000e+00,  1.93811499e-17],
        [-1.93276086e-16,  1.05945707e-16,  1.00000000e+00]],

       [[ 1.00000000e+00, -9.85907931e-17,  4.25028119e-17],
        [ 1.41086177e-17,  1.00000000e+00, -4.90676220e-17],
        [ 3.76376938e-18, -1.14055265e-17,  1.00000000e+00]]])
        
        
        array([[[ 1.00000000e+00,  1.19884383e-16, -7.17840702e-17],
        [-1.40518580e-16,  1.00000000e+00, -7.07869813e-17],
        [-1.60808076e-17, -1.64861074e-17,  1.00000000e+00]],

       [[ 1.00000000e+00, -1.90556964e-17,  3.97734187e-17],
        [-2.81526510e-17,  1.00000000e+00,  1.93811499e-17],
        [-1.93276086e-16,  1.05945707e-16,  1.00000000e+00]],

       [[ 1.00000000e+00, -9.85907931e-17,  4.25028119e-17],
        [ 1.41086177e-17,  1.00000000e+00, -4.90676220e-17],
        [ 3.76376938e-18, -1.14055265e-17,  1.00000000e+00]]])
반응형