用語比較
np.linalg.invとnp.linalg.solveの違い|逆行列を返すか、連立方程式の解を返すか(Python3データ分析)
np.linalg.inv は行列の逆行列を返し、np.linalg.solve は係数行列 a と右辺 b を受け取って、連立方程式 ax = b の解 x を返します。
行列そのものがほしいなら inv、解がほしいなら solveと分けます。どちらも、正方行列でないと LinAlgError になります。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。
np.linalg.invとnp.linalg.solveの要点
np.linalg.inv
正方行列 a の逆行列 ainv を返す。a @ ainv も ainv @ a も単位行列 eye になる。a が正方でない、または逆行列の計算に失敗すると LinAlgError になる。
np.linalg.solve
係数行列 a と右辺 b から、線形方程式 ax = b の解 x を返す。a が特異または正方でないときは LinAlgError になる。
違いを表で確認
| 比較軸 | np.linalg.inv | np.linalg.solve |
|---|---|---|
| 渡す引数 | 行列 a だけを渡す。inv(a) と書く | 係数行列 a と右辺 b の2つを渡す。solve(a, b) と書く |
| 戻り値 | 逆行列 ainv。a と同じ (M, M) の形 | 解 x。b が (M,) の形なら (M,)、b が (M, K) の形なら (M, K) の形 |
| 公式の例 | a = [[1, 2], [3, 4]] の逆行列を求め、a @ ainv が eye(2) に近いことを np.allclose で確かめる | x0 + 2*x1 = 1 と 3*x0 + 5*x1 = 2 を解き、array([-1., 1.]) を得る |
| LinAlgError が出る条件 | a が正方でない、または逆行列の計算に失敗したとき。特異と検出されたときも出る | a が特異、または正方でないとき |
Python3エンジニア認定データ分析試験の学習に使う書籍(Amazon)
PRどこで迷っているかを切り分ける
逆行列そのものを確認したい人
inv を使います。公式は、a @ ainv = ainv @ a = eye(a.shape[0]) を満たす ainv を返すと説明しています。
連立方程式の解 x を求めたい人
solve を使います。x0 + 2*x1 = 1 と 3*x0 + 5*x1 = 2 なら、a = [[1, 2], [3, 5]]、b = [1, 2] を渡して x = [-1, 1] を得ます。
解けない連立方程式に当たった人
a が特異(行どうしが一次独立でない)か正方でないと、solve は LinAlgError を出します。公式は、その場合に最小二乗法の lstsq を使うよう案内しています。
具体例で使い分ける
例 1
solve で連立方程式を解く
公式の例の x0 + 2*x1 = 1 と 3*x0 + 5*x1 = 2 を解きます。
- a = np.array([[1, 2], [3, 5]])、b = np.array([1, 2]) とします。
- np.linalg.solve(a, b) は array([-1., 1.]) を返します。
- 確かめると、-1 + 2×1 = 1、3×(-1) + 5×1 = 2 で、どちらも右辺と一致します。
結論: 解 x がほしいなら、solve に係数行列と右辺を渡します。
例 2
inv で逆行列を求める
公式の例の a = np.array([[1., 2.], [3., 4.]]) の逆行列を求めます。
- ainv = inv(a) と書きます。
- np.allclose(a @ ainv, np.eye(2)) も np.allclose(ainv @ a, np.eye(2)) も True になります。
- どちら向きに掛けても単位行列になるのが、逆行列の性質です。
結論: 逆行列そのものがほしいなら、inv に行列だけを渡します。
例 3
逆行列を持たない行列
a が特異(逆行列を持たない)行列のときです。
- inv は、特異だと検出されると LinAlgError を出します。
- solve も、a が特異なら LinAlgError を出します。
- 公式は inv について、条件数が悪い行列では LinAlgError が出るとは限らず、浮動小数点の誤差で結果が不正確になることがあると注意しています。
結論: 特異な行列では、どちらも LinAlgError です。エラーが出ないからといって、結果が正確とは限りません。
問題文から答えを選ぶ手順
- 1
何がほしいかを決める
行列 a の逆行列ならば inv、連立方程式 ax = b の解 x ならば solve です。
- 2
引数の数を見る
inv(a) は引数1つ、solve(a, b) は引数2つです。b を渡しているなら、解を求める場面です。
- 3
a が正方でフルランクかを見る
solve は、a が正方でフルランク(行どうし、列どうしが一次独立)であることが前提です。そうでなければ、公式は lstsq を案内しています。
試験での見分け方
- 1逆行列そのものがほしいときは inv を使う。
- 2連立方程式 ax = b の解を求めるときは solve に a と b を渡す。
- 3a が特異または正方でないとき、inv も solve も LinAlgError になる。
- 4条件数が悪い行列では、inv は LinAlgError を出さず、不正確な結果を返すことがある。
誤答しやすい選択肢
solve が逆行列を返すと考える
修正: solve が返すのは解 x です。逆行列を返すのは inv で、戻り値は a と同じ (M, M) の形です。
エラーが出なければ inv の結果は正確だと考える
修正: 公式は、条件数が悪い行列では LinAlgError が出るとは限らず、浮動小数点の誤差で不正確になることがあると注意しています。
正方でない行列でも solve で解けると考える
修正: a が正方でないと LinAlgError になります。フルランクでない場合の最小二乗解には lstsq を使うよう、公式が案内しています。
確認問題
Q1連立方程式 ax = b の解 x を返すのは、invとsolveのどちらか?
答え: solve
inv は逆行列を返します。solve には係数行列 a と右辺 b を渡します。
Q2a = [[1, 2], [3, 5]]、b = [1, 2] のとき、np.linalg.solve(a, b) の結果は?
答え: array([-1., 1.])
x0 = -1、x1 = 1 で、x0 + 2*x1 = 1 と 3*x0 + 5*x1 = 2 を満たします。
Q3np.linalg.inv(a) で返る ainv が満たす式は?
答え: a @ ainv = ainv @ a = eye(a.shape[0])
どちら向きに掛けても単位行列になります。
Q4a が特異のとき、np.linalg.solve はどうなるか?
答え: LinAlgError になる
a は正方でフルランクである必要があります。そうでなければ、公式は lstsq を案内しています。
到達チェック
- invとsolveの戻り値の違いを説明できる
- solve(a, b) の2つの引数の意味を言える
- LinAlgError が出る条件を答えられる
- 条件数が悪い行列での inv の注意点を言える
関連ページで確認する
同じ資格で次に知りたいこと
- np.arangeとnp.linspaceの違い|刻み幅で指定するか、点の数で指定するか(Python3データ分析)
NumPyのnp.arange(刻み幅を指定)とnp.linspace(要素の数を指定)の違いを、終点を含むか、小数の刻みでの要素数、戻り値の型で整理します。NumPy公式リファレンスとQuickstartの例で照合した、arange(3, 7, 2)とlinspace(2.0, 3.0, num=5)の結果つきです。
- predictとpredict_probaの違い|クラスのラベルと確率(Python3データ分析)
scikit-learnの分類器のpredictとpredict_probaの違いを、返す値、配列の形、列の並び順、decision_functionとの関係で整理します。LogisticRegressionの公式の例で照合した確認問題つき。
- np.meanとnp.averageの違い|重みを付けられるのはどちらか(Python3データ分析)
NumPyのnp.mean(算術平均)とnp.average(加重平均)の違いを、weights引数、returned引数、重みの合計が0のときの動きで整理します。NumPy公式リファレンスの例で照合した、np.average(np.arange(1, 11), weights=np.arange(10, 0, -1))が4.0になる計算つきです。
よくある質問
Qnp.linalg.invとnp.linalg.solveの違いは?
inv は正方行列の逆行列を返します。solve は係数行列 a と右辺 b から、連立方程式 ax = b の解 x を返します。
Qどちらも LinAlgError が出ますか?
inv は、a が正方でない、または逆行列の計算に失敗したときに出ます。solve は、a が特異または正方でないときに出ます。
Q解けない連立方程式はどうしますか?
a が正方でフルランクでないときは、公式が最小二乗法の lstsq を案内しています。
Qデータ分析試験の範囲?
本サイトの第2章数学の基礎の「線形代数」で扱います。出題の形式や範囲は、受験前に公式の案内で確認してください。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: AI資格ドリル編集部(運営者情報を見る)
