web-dev-qa-db-ja.com

Pythonマトリックスの逆

Pythonで行列の逆行列を取得するにはどうすればよいですか?私はそれを自分で実装しましたが、それは純粋なpythonです。

57
Claudiu

マトリックス操作を行う場合は、 numpy をご覧ください。これは主にCで書かれたモジュールで、純粋なpythonでのプログラミングよりもはるかに高速です。マトリックスを反転し、他のマトリックス操作を行う方法の例を次に示します。

from numpy import matrix
from numpy import linalg
A = matrix( [[1,2,3],[11,12,13],[21,22,23]]) # Creates a matrix.
x = matrix( [[1],[2],[3]] )                  # Creates a matrix (like a column vector).
y = matrix( [[1,2,3]] )                      # Creates a matrix (like a row vector).
print A.T                                    # Transpose of A.
print A*x                                    # Matrix multiplication of A and x.
print A.I                                    # Inverse of A.
print linalg.solve(A, x)     # Solve the linear equation system.

また、 array モジュールを見ることができます。これは、1つのデータ型のみを処理する必要がある場合のリストのはるかに効率的な実装です。

102
Mapad

本当にマトリックスを反転する必要があることを確認してください。これは多くの場合不要であり、数値的に不安定になる可能性があります。ほとんどの人が行列の反転方法を尋ねるとき、彼らは本当にAx = bを解く方法を知りたいのです。ここで、Aは行列でxとbはベクトルです。 Aの逆数を計算してから逆数にBを乗算するよりも、xの方程式Ax = bを直接解くコードを使用する方が効率的で正確です。 Aを反転するには、複数のb値についてシステムを解く必要がある場合、Aのコレスキー分解を保存しますが、それを反転しないでください。

その行列を反転させない を参照してください。

53
John D. Cook

ここで繰り返される選択された行列が特異であるか、条件が悪いことは残念です。

A = matrix( [[1,2,3],[11,12,13],[21,22,23]])

定義により、行列A自体を乗算したときのAの逆数は、単位行列を与える必要があります。賞賛された説明で選ばれたAはそれをしません。実際、逆を見るだけで、反転が正しく機能しなかった手がかりが得られます。個々の項の大きさを見てください-元のA行列の項と比較して、非常に大きいです...

マトリックスの例を選ぶとき、人間が特異なマトリックスを選ぶことに成功することは驚くべきことです!

ソリューションに問題があったので、さらに調査しました。 ubuntu-kubuntuプラットフォームでは、debianパッケージnumpyにはマトリックスとlinalgサブパッケージがないため、numpyのインポートに加えて、scipyもインポートする必要があります。

Aの対角項に十分な大きさの係数(2など)を掛けると、行列は特異またはほぼ特異でなくなる可能性が高くなります。そう

A = matrix( [[2,2,3],[11,24,13],[21,22,46]])

単数でもほぼ単数でもなくなり、例から意味のある結果が得られます。

ご協力いただきありがとうございます、

OldAl。

10
user377367

再帰的な行列の行列式を計算してから、隣接行列を形成できます

これは短いチュートリアルです

これは正方行列でのみ機能すると思います

これらを計算する別の方法は、グラムシュミットの直交化を含み、次に行列を転置します。直交化された行列の転置はその逆です!

6
lee

Numpyはほとんどの人に適していますが、 Sympyの行列

これらのコマンドを http://live.sympy.org/ で実行してみてください

_M = Matrix([[1, 3], [-2, 3]])
M
M**-1
_

楽しみのために、M**(1/2)を試してください

5
Colonel Panic

Numpyが嫌いなら、RPyとRのローカルコピーを取り出して、代わりに使用してください。

(また、マトリックスを本当に反転させる必要があるようにエコーします。たとえば、Rでは、linalg.solveとsolve()関数は実際には完全な反転を行いません。

1
Gregg Lind