AI資格ドリル
資格を選ぶ

用語比較

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.invnp.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

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

逆行列そのものを確認したい人

inv を使います。公式は、a @ ainv = ainv @ a = eye(a.shape[0]) を満たす ainv を返すと説明しています。

02

連立方程式の解 x を求めたい人

solve を使います。x0 + 2*x1 = 1 と 3*x0 + 5*x1 = 2 なら、a = [[1, 2], [3, 5]]、b = [1, 2] を渡して x = [-1, 1] を得ます。

03

解けない連立方程式に当たった人

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. 1

    何がほしいかを決める

    行列 a の逆行列ならば inv、連立方程式 ax = b の解 x ならば solve です。

  2. 2

    引数の数を見る

    inv(a) は引数1つ、solve(a, b) は引数2つです。b を渡しているなら、解を求める場面です。

  3. 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 の注意点を言える

同じ資格で次に知りたいこと

よくある質問

Qnp.linalg.invとnp.linalg.solveの違いは?

A

inv は正方行列の逆行列を返します。solve は係数行列 a と右辺 b から、連立方程式 ax = b の解 x を返します。

Qどちらも LinAlgError が出ますか?

A

inv は、a が正方でない、または逆行列の計算に失敗したときに出ます。solve は、a が特異または正方でないときに出ます。

Q解けない連立方程式はどうしますか?

A

a が正方でフルランクでないときは、公式が最小二乗法の lstsq を案内しています。

Qデータ分析試験の範囲?

A

本サイトの第2章数学の基礎の「線形代数」で扱います。出題の形式や範囲は、受験前に公式の案内で確認してください。

次に見る比較

執筆: AI資格ドリル編集部(運営者情報を見る)