Pythonで逆行列を計算する方法!NumPyの使い方からエラーの対処法まで紹介
線形代数を扱うプログラミングにおいて、逆行列の計算は避けて通れない重要な処理のひとつです。特にデータ分析や機械学習の分野では、連立方程式を解いたり、行列の変換を行ったりする際に頻繁に登場します。
Pythonには逆行列を簡単に求められるライブラリがいくつも用意されていますが、それぞれに特徴があり、状況に応じて使い分けることが大切です。本記事では、NumPyを中心に、SciPyやSymPyといったライブラリを使った逆行列の計算方法を丁寧に解説していきます。
エラーが発生したときの対処法も併せて紹介しますので、実務での活用にお役立てください。
そもそもPythonの逆行列とは?定義と計算式

逆行列について説明する前に、まず「行列」とは何かを確認しておきましょう。行列とは、数字を縦と横に並べた表のようなもので、数学やプログラミングでよく使われます。
そして逆行列は、ある行列に掛け合わせると「単位行列」になる特別な行列のことです。単位行列というのは、対角線上(左上から右下への斜めライン)が1で、それ以外がすべて0になっている行列を指します。
身近な例で考えてみると、普通の数字の世界では、5という数に対して1/5(0.2)を掛けると1になります。この1/5が「5の逆数」です。
行列の世界でも同じように、ある行列Aに対して別の行列を掛けると単位行列(数字でいう「1」のような存在)になる関係があり、この「別の行列」が逆行列なのです。数式で表すと、行列Aの逆行列をA⁻¹と書き、次のような関係が成り立ちます。
A × A⁻¹ = I(単位行列)逆行列は連立方程式を解いたり、図形を元の位置に戻したりする際に役立ちます。ただし、すべての行列に逆行列があるわけではなく、「正方行列」(縦と横のサイズが同じ行列)で、かつ「行列式が0でない」という条件を満たす必要があります。
以下の記事では、Pythonの機械学習について詳しく解説しています。興味のある方はぜひご一読ください。
余因子行列を用いた求め方
余因子行列を使った逆行列の求め方は少し複算が複雑ですが、手順を追っていけば理解できます。2×2の行列を例に説明していきましょう。
まず、次のような2×2の行列Aがあるとします。
A = | a b |
| c d |この行列の逆行列を求めるには、以下の3つのステップを踏みます。
ステップ1:行列式を計算する
行列式とは、行列から計算される1つの数値のことです。2×2行列の場合、次のように計算します。
det(A) = ad - bc例えば、a=2、 b=1、 c=3、 d=4なら、行列式は2×4 – 1×3 = 5となります。
ステップ2:余因子行列を作る
余因子行列は、元の行列の各要素を特定のルールで置き換えて作ります。2×2行列の場合、対角線の要素を入れ替えて、もう一方の対角線の符号を反転させます。
余因子行列 = | d -b |
| -c a |ステップ3:余因子行列を行列式で割る
最後に、余因子行列の各要素を行列式で割ることで逆行列が完成します。
A⁻¹ = (1/det(A)) × | d -b |
|-c a |具体例として、A = |2 1| という行列の逆行列を求めてみましょう。
|3 4|
行列式:2×4 - 1×3 = 5
余因子行列:| 4 -1||-3 2|
逆行列:(1/5) × | 4 -1| = | 0.8 -0.2||-3 2| |-0.6 0.4|この方法は3×3以上の大きな行列でも使えますが、計算がかなり複雑になっていきます。そのため、実際のプログラミングではPythonのライブラリに任せることが一般的です。
行基本変形(掃き出し法)を用いた求め方
行基本変形、別名「掃き出し法」は、逆行列を求める別の方法です。この方法は、元の行列を少しずつ変形していって最終的に単位行列にする、というステップを踏みます。
具体的な手順を見ていきましょう。
基本的な考え方
元の行列Aの右側に単位行列Iを並べて、拡大行列を作ります。そして、左側の行列Aを単位行列に変形していく過程で、右側の単位行列が逆行列に変わっていくという仕組みです。
[ A | I ] → [ I | A⁻¹ ]使える操作は3種類
行基本変形では、次の3つの操作だけを使います。
- ある行を定数倍する
- ある行に別の行の定数倍を足す(または引く)
- 2つの行を入れ替える
具体例
例として、次の2×2行列の逆行列を求めてみます。
A = |2 1|
|3 4|まず、拡大行列を作ります。
|2 1 | 1 0|
|3 4 | 0 1|次に、左側を単位行列にしていきます。
ステップ1:1行目を2で割る
|1 0.5 | 0.5 0|
|3 4 | 0 1|・ステップ2:2行目から1行目の3倍を引く
|1 0.5 | 0.5 0 |
|0 2.5 | -1.5 1 |・ステップ3:2行目を2.5で割る
|1 0.5 | 0.5 0 |
|0 1 | -0.6 0.4|・ステップ4:1行目から2行目の0.5倍を引く
|1 0 | 0.8 -0.2|
|0 1 | -0.6 0.4|左側が単位行列になったので、右側に残った行列が逆行列です。
A⁻¹ = | 0.8 -0.2|
|-0.6 0.4|この方法は計算の流れが分かりやすく、大きな行列でも同じ手順で求められるのが利点です。ただし手計算だと時間がかかるため、Pythonで自動化することが実用的といえるでしょう。
逆行列の理論的な理解を深めたら、実際にPythonでコードを書いて手を動かすことが重要です。今回解説したような線形代数の知識は、データ分析や機械学習の現場で必須のスキルとなります。
もし「Pythonの基礎からNumPyなどの数値計算ライブラリまで体系的に学びたい」とお考えなら、DMM WEBCAMP Pythonコースも検討してみてください。現役エンジニアによる週2回のマンツーマンメンタリングと24時間対応のチャットサポートで、機械学習プログラムの開発まで実践的に学べます。
さらに、経済産業省のリスキリング支援事業の認定講座として、最大70%のキャッシュバック(213,054円)が受けられる給付金制度も用意されているため、費用面でも始めやすい環境が整っています。
>>DMM WEBCAMP Pythonコースの詳細はこちら
「なんか今の仕事合わないな・・・」
「IT業界に転職してみたいなぁ・・・」
という方、DMMが運営する「WEBCAMP エンジニア転職」をご検討してみてはいかがですか?
「WEBCAMP エンジニア転職」では最短12週間でITエンジニアを目指すことが可能です!
WEBCAMPの卒業生は転職後に年収もUP!(例:年収250万円→500万円)
しかも今なら受講料の最大70%が給付金として支給されます。
DMM WEBCAMPは経済産業省・厚生労働省が認定した専門実践教育訓練給付金制度の対象です
Pythonで逆行列を求める方法【NumPy編】

ここからは、実際にPythonで逆行列を計算する具体的な方法を見ていきましょう。Pythonには数値計算を得意とするNumPyというライブラリがあり、これを使えば複雑な行列計算も簡単に実行できます。
手計算では時間のかかる3×3以上の大きな行列でも、わずか数行のコードで逆行列を求められるのが大きな魅力です。ライブラリの概要については、以下の記事を参考にしてみてください。
np.linalg.inv()を使った求め方
NumPyで逆行列を求めるには、「np.linalg.inv()」という関数を使います。この関数は線形代数(Linear Algebra)に関する計算をまとめたlinalgモジュールの中にあり、inverse(逆)という意味のinvという名前がついています。
使い方は引数として逆行列を求めたい行列を渡すだけですが、正方行列(縦と横のサイズが同じ行列)であることが必須条件となります。また、逆行列が存在しない行列(行列式が0の行列)を指定するとエラーが発生しますので注意が必要です。
基本的な書き方は以下のとおりです。
import numpy as np
逆行列 = np.linalg.inv(元の行列)まずNumPyをインポートして、inv()関数に行列を渡せば、戻り値として逆行列が得られます。
計算例(サンプルコード)
それでは、実際に2×2の行列から逆行列を求めてみましょう。
import numpy as np
# 2×2の行列を用意します
matrix_2x2 = np.array([[-4, 2], [7, 2]])
# 逆行列を計算
inverse_matrix = np.linalg.inv(matrix_2x2)
print("元の行列:")
print(matrix_2x2)
print("\n逆行列:")
print(inverse_matrix)実行すると、次のような結果が表示されます。
元の行列:
[[-4 2]
[ 7 2]]
逆行列:
[[-0.09090909 0.09090909]
[ 0.31818182 0.18181818]]次に、3×3の行列で試してみましょう。
import numpy as np
# 3×3の行列を作成
matrix_3x3 = np.array([[8, -6, 6], [-7, -1, -8], [-7, 1, 3]])
# 逆行列を求める
result = np.linalg.inv(matrix_3x3)
print("元の行列:")
print(matrix_3x3)
print("\n逆行列:")
print(result)
# 検算:元の行列と逆行列の積を計算
check = np.dot(matrix_3x3, result)
print("\n検算結果(単位行列になっているか確認):")
print(check)実行結果は以下のようになります。
元の行列:
[[ 8 -6 6]
[-7 -1 -8]
[-7 1 3]]
逆行列:
[[-0.00988142 -0.04743083 -0.10671937]
[-0.15217391 -0.13043478 -0.04347826]
[ 0.02766798 -0.06719368 0.09881423]]
検算結果(単位行列になっているか確認):
[[ 1.00000000e+00 0.00000000e+00 0.00000000e+00]
[ 1.11022302e-16 1.00000000e+00 0.00000000e+00]
[-5.55111512e-17 1.11022302e-16 1.00000000e+00]]検算結果を見ると、対角成分が1で他が0(または非常に小さい値)になっており、単位行列が得られていることが確認できます。
小さい値(例えば1.11022302e-16)が表示されているのは、コンピュータの計算誤差によるもので、実質的には0として扱えます。
逆行列が存在しない場合のエラー(Singular matrix)と対処法
NumPyで逆行列を計算する際、すべての行列が逆行列を持つわけではありません。逆行列が存在しない行列に対して「np.linalg.inv()」を実行すると、「Singular matrix(特異行列)」というエラーが発生します。
また、計算結果が期待通りにならないこともあります。ここでは、エラーが起きる原因と、その対処法について詳しく見ていきます。
エラーが起きる主な原因
逆行列が存在しない、あるいは計算がうまくいかないケースは、主に以下の場合です。
| 原因 | 解説 | 例 |
|---|---|---|
| 行列式が0の場合 | 行列式(determinant)が0になる行列は逆行列を持たない。これを「特異行列」または「退化行列」と呼ぶ。 数学的に、逆行列は「元の行列に掛けると単位行列になる行列」だが、行列式が0だとこの条件を満たす行列が存在しない。 | [[1, 2], [2, 4]]のような行列 |
| 行や列が線形従属の場合 | ある行が他の行の定数倍になっている、あるいはある列が他の列の組み合わせで表せる場合、行列式が0になる。 たとえば、2行目が1行目の2倍になっているような行列では、情報が重複しているため逆行列が求められない。 | 2行目が1行目の2倍になっている行列 |
| 計算精度による誤差 | 逆行列の計算は、コンピュータの浮動小数点演算の特性上、誤差が生じやすい処理。 そのため、理論上は単位行列になるはずの検算結果でも、1.11022302e-16のような非常に小さな値が表示されることがある。 これは計算誤差であり、実質的には0として扱って問題ない。 | 検算時に8.88178420e-16のような値が表示される |
実際にエラーが発生する例を見てみましょう。
import numpy as np
# 逆行列が存在しない行列(2行目が1行目の2倍)
singular_matrix = np.array([[1, 2], [2, 4]])
print("行列:")
print(singular_matrix)
# 行列式を確認
det = np.linalg.det(singular_matrix)
print(f"\n行列式: {det}")
# 逆行列を求めようとするとエラーが発生
try:
inv = np.linalg.inv(singular_matrix)
except np.linalg.LinAlgError as e:
print(f"\nエラー発生: {e}")実行すると、次のような結果が表示されます。
行列:
[[1 2]
[2 4]]
行列式: 0.0
エラー発生: Singular matrixこのように、行列式が0の場合は逆行列が求められず、エラーが発生します。そこで、逆行列が求められない場合や、計算結果が不安定な場合の対処方法をいくつか紹介します。
対処法1. 事前に行列式をチェックする
逆行列を求める前に、「np.linalg.det()」で行列式を計算し、0に近い値でないか確認しましょう。行列式が0または0に非常に近い場合は、逆行列の計算を避けることができます。
import numpy as np
matrix = np.array([[1, 2], [3, 4]])
# 行列式をチェック
determinant = np.linalg.det(matrix)
if abs(determinant) < 1e-10: # 非常に小さい値を許容範囲とする
print("この行列は逆行列を持ちません")
else:
inverse = np.linalg.inv(matrix)
print("逆行列:")
print(inverse)対処法2. 疑似逆行列を使う
逆行列が存在しない場合でも、疑似逆行列(Moore-Penrose逆行列)なら計算できます。疑似逆行列は、正方行列でない場合や特異行列でも計算可能で、最小二乗法などでよく使われます。
「np.linalg.pinv()」を使いましょう。
import numpy as np
# 逆行列が存在しない行列
singular_matrix = np.array([[1, 2], [2, 4]])
# 疑似逆行列を計算
pseudo_inverse = np.linalg.pinv(singular_matrix)
print("疑似逆行列:")
print(pseudo_inverse)対処法3. 検算結果の誤差を理解する
逆行列を求めた後、元の行列との積を取って単位行列になるか検証することがあります。この際、理論上は単位行列になるはずでも、実際には「1.11022302e-16」のような非常に小さな値が表示されることがあります。
import numpy as np
matrix = np.array([[1, 2], [3, 4]])
inverse = np.linalg.inv(matrix)
# 積を計算
result = np.dot(matrix, inverse)
print(result)[[1.00000000e+00 0.00000000e+00]
[8.88178420e-16 1.00000000e+00]]「8.88178420e-16」は実質的に0なので、これは正しく単位行列が得られていると判断できます。この誤差は浮動小数点演算の特性によるもので、逆行列の計算では避けられない現象です。
対処法4. データを見直す
実際の計算では、入力データに誤りがないか、行列の構造が正しいかを確認することも重要です。中でも、重複した行や列が含まれていないか、データの入力ミスがないかをチェックしましょう。
逆行列の計算は機械学習や連立方程式の解法で頻繁に使われるため、エラーへの対処法を知っておくと実務で役立ちます。とくに疑似逆行列の存在を知っておくことで、より柔軟な問題解決が可能になるでしょう。
Pythonで逆行列を求める方法【SciPy/SymPy編】

NumPyは逆行列計算の基本として十分な機能を持っていますが、さらに高度な数値計算や記号計算が必要な場面では、SciPyやSymPyといった専門的なライブラリが力を発揮します。
SciPyはNumPyを拡張した形で科学技術計算全般をカバーし、SymPyは数式を文字のまま扱える記号計算システムです。それぞれの特徴と使い方を見ていきましょう。
より高度な計算が可能なSciPy
SciPyは、NumPyを基盤として構築された科学技術計算用のライブラリです。
線形代数、最適化、統計解析、信号処理など、幅広い分野の数値計算機能を提供しています。逆行列の計算に関しても、NumPyより安定した計算アルゴリズムを持ち、より複雑な行列演算に対応できます。
SciPyの線形代数モジュール(scipy.linalg)は、NumPyの「numpy.linalg」よりも多機能で、特異値分解や疑似逆行列など、より専門的な行列計算が可能です。また、数値的な安定性にも優れており、実務レベルの計算でよく使われています。
逆行列を求める際は、「scipy.linalg.inv()」という関数を使います。使い方はNumPyとほぼ同じですが、内部的により洗練されたアルゴリズムを採用しているため数値誤差が少なく、より精度の高い結果が得られます。
計算例(サンプルコード)
実際にSciPyを使って逆行列を計算してみます。
import numpy as np
from scipy import linalg
# 2×2の行列を作成
matrix_A = np.array([[1, 2], [3, 4]])
print("元の行列:")
print(matrix_A)
# SciPyで逆行列を計算
inverse_A = linalg.inv(matrix_A)
print("\n逆行列:")
print(inverse_A)
# 検証:元の行列と逆行列の積を計算
verification = np.dot(matrix_A, inverse_A)
print("\n検証(単位行列になっているか):")
print(verification)実行結果:
元の行列:
[[1 2]
[3 4]]
逆行列:
[[-2. 1. ]
[ 1.5 -0.5]]
検証(単位行列になっているか):
[[1.0000000e+00 0.0000000e+00]
[8.8817842e-16 1.0000000e+00]]次に、3×3の行列でも試してみましょう。
# より大きな3×3の行列
matrix_B = np.array([[2, 1, 1], [1, 3, 2], [1, 0, 0]])
print("3×3の行列:")
print(matrix_B)
# 逆行列を計算
inverse_B = linalg.inv(matrix_B)
print("\n逆行列:")
print(inverse_B)
# 固有値も計算できます
eigenvalues, eigenvectors = linalg.eig(matrix_B)
print("\n固有値:")
print(eigenvalues)実行結果:
3×3の行列:
[[2 1 1]
[1 3 2]
[1 0 0]]
逆行列:
[[ 0. 0. 1.]
[-2. 1. 3.]
[ 3. -1. -5.]]
固有値:
[4.56155281+0.j 0.43844719+0.j 0. +0.j]SciPyの強みは、逆行列の計算だけでなく、固有値や固有ベクトルの計算など、より高度な線形代数の処理もスムーズに行えることです。NumPyで基礎を固めた後、より専門的な計算が必要になったらSciPyへ移行するのが良い流れといえるでしょう。
文字式のまま解くことが可能なSymPy
SymPyは、Pythonで記号計算を行うためのライブラリです。
NumPyやSciPyが数値計算に特化しているのに対し、SymPyは数式を文字や記号のまま扱えるのが最大の特徴です。具体的な数値を代入せずに、一般的な形で逆行列の公式を導出したり、変数を含む行列の逆行列を求めたりできます。
例えば、数学の教科書に載っているような「a、b、c、dを要素とする行列の逆行列は…」といった一般的な式を、そのまま計算して確認できるのです。これは数学の学習や理論的な検証において非常に役立ちます。
SymPyで逆行列を求めるには、「sympy.Matrix」で行列を定義し、.inv()メソッドまたは**(-1)を使います。計算結果は数式として出力されるため、数学的な理解を深めるのに最適です。
計算例(サンプルコード)
SymPyを使って記号計算を行ってみます。
import sympy
# 文字を変数として定義
a, b, c, d = sympy.symbols('a b c d')
# 文字式を要素とする2×2行列を作成
matrix_sym = sympy.Matrix([[a, b], [c, d]])
print("文字式の行列:")
sympy.pprint(matrix_sym)
# 逆行列を計算
inverse_sym = matrix_sym.inv()
print("\n逆行列の一般式:")
sympy.pprint(inverse_sym)
# 逆行列を簡略化
simplified = sympy.simplify(inverse_sym)
print("\n簡略化した逆行列:")
sympy.pprint(simplified)実行結果:
文字式の行列:
⎡a b⎤
⎢ ⎥
⎣c d⎦
逆行列の一般式:
⎡ d -b ⎤
⎢───── ─────── ⎥
⎢a⋅d - b⋅c a⋅d - b⋅c⎥
⎢ ⎥
⎢ -c a ⎥
⎢───── ─────── ⎥
⎣a⋅d - b⋅c a⋅d - b⋅c⎦
簡略化した逆行列:
⎡ d -b ⎤
⎢───── ─────── ⎥
⎢a⋅d - b⋅c a⋅d - b⋅c⎥
⎢ ⎥
⎢ -c a ⎥
⎢───── ─────── ⎥
⎣a⋅d - b⋅c a⋅d - b⋅c⎦これは数学の教科書で見る2×2行列の逆行列の公式そのものです。SymPyを使えば、このような一般的な公式を実際に計算で確認できます。
次に、具体的な数値を代入してみましょう。
# 具体的な数値を代入
matrix_concrete = sympy.Matrix([[1, 2], [3, 4]])
print("具体的な数値の行列:")
sympy.pprint(matrix_concrete)
# 逆行列を計算
inverse_concrete = matrix_concrete.inv()
print("\n逆行列:")
sympy.pprint(inverse_concrete)
# 行列式も簡単に計算できます
determinant = matrix_concrete.det()
print(f"\n行列式: {determinant}")
# 検証:元の行列と逆行列の積
verification = matrix_concrete * inverse_concrete
print("\n検証(単位行列になっているか):")
sympy.pprint(verification)実行結果:
具体的な数値の行列:
⎡1 2⎤
⎢ ⎥
⎣3 4⎦
逆行列:
⎡-2 1 ⎤
⎢ ⎥
⎣3/2 -1/2⎦
行列式: -2
検証(単位行列になっているか):
⎡1 0⎤
⎢ ⎥
⎣0 1⎦SymPyの強みは、結果が分数形式で正確に表示されることです。
NumPyやSciPyでは浮動小数点数で近似値が表示されますが、SymPyは厳密な値を保持します。また、行列式の計算や単位行列の確認も、見やすい形式で出力されます。
SymPyは数値計算の速度ではNumPyやSciPyに劣りますが、数式の変形や理論的な検証、教育目的での使用には最適です。特に、数学的な理解を深めたい場合や、論文やレポートで数式を示す必要がある場合に重宝します。
さて、ここまで紹介したNumPy、SciPy、SymPyは、いずれもPythonのデータ分析や科学計算において必須のライブラリです。これらを実務レベルで使いこなせるようになりたい方は、体系的なカリキュラムで学べるプログラミング学習サービスを検討してみるのも良いでしょう。
DMM WEBCAMP Pythonコースでは、現役エンジニアによる週2回のマンツーマンメンタリングと24時間対応のチャットサポートで、NumPyやPandasといった数値計算ライブラリから機械学習プログラムの開発まで実践的に学べます。
さらに経済産業省のリスキリング支援事業の認定講座として、最大70%、金額にして213,054円のキャッシュバックが受けられる給付金制度も用意されているため、費用面からスクール受講に悩んでいる方にもおすすめです。
>>DMM WEBCAMP Pythonコースの詳細はこちら
まとめ
本記事では、Pythonで逆行列を計算する方法を、理論から実践まで幅広く解説してきました。
NumPyは数値計算の基礎として、SciPyはより専門的な科学技術計算に、SymPyは記号計算や理論的な検証に、それぞれ適しています。こうしたライブラリを使い分けることで、機械学習やデータ分析、連立方程式の解法など、実務で必要な行列計算を効率的に行えるようになります。
ぜひ実際にコードを動かして、逆行列計算の理解を深めてみてはいかがでしょうか。