2016-08-04 12 views
2

私はPythonでいくつかのMatlabコードを変換しています。私はいくつかの行列操作を行う必要があります。私の行列(A)は(今は)65x3行列です。ただし、行数はプログラムのどのステップに応じて変わります。効率的なndarray操作

Matlabのでは、私が働いているコードは次のとおりです。

output = inv(A'*A) * A'; 

次のPythonコードはうまく予想される出力を再生します。私はちょうどこれをするために良い(Pythonic、高速など)方法がある場合は好奇心が強いですか?私は基本的なPythonとnumpyに固執しようとしています。

output = np.dot(np.linalg.inv(np.dot(np.transpose(A), A)), np.transpose(A)) 

助けてくれる人のおかげです。

+0

転置用にショートカット「A.T」を使用すること以外は、はるかに良くできません。 (しかしこれは本当にちょうど目の砂糖です、実際の違いはありません) – Julien

+0

行列Aの擬似逆行列を計算しているようです。アプリケーションが擬似逆行列を計算する必要がある場合を除き、逆行列の計算を避けることができれば、実行しないでください。ジョンD.クックのこの記事は、http://www.johndcook.com/blog/2010/01/19/dont-invert-that-matrix/の洞察を提供します。過小(または未決定)の方程式のシステムに対して最小二乗解を見つけようとするなら、['numpy.linalg.lstsq'](http://docs.scipy.org/doc/numpy/reference/ generated/numpy.linalg.lstsq.html)メソッドを使用してソリューションを直接計算します。 – rayryeng

答えて

1

T属性を使用できます(配列を転置します)。また、Python 3.5を使用している場合は、ドットプロダクトに@を使用できます(詳細はPEP 465を参照)。

output = np.linalg.inv(A.T @ A) @ A.T 
+0

ありがとうございます。それは完璧だった。私はそれを書く良い方法がなければならないことを知っていました。 – Adam

+0

あなたは大歓迎です:) – Alex

+0

'inv'をたくさん使っている場合は、ファイルの先頭に' numpy.linalg import inv'を実行してから 'output = inv(AT @ A) @ AT 'とする。また、複素数を扱う場合、MATLABバージョンと同じように動作しないことに注意してください。その場合、MATLAB転置は単純な配列転置ではなく、要素のコンジュゲートも使用します。 – TheBlackCat

関連する問題