12

私が取り組んでいる科学/工学アプリケーションには、多くの線形代数行列の乗算があるため、Numpy 行列を使用しています。ただし、python には、行列型または配列型を交換可能に受け入れる関数が多数あります。いいね、いいえ?まあ、そうではありません。例で問題を示しましょう。

from scipy.linalg import expm
from numpy import matrix

# Setup input variable as matrix
A = matrix([[ 0, -1.0,  0,  0],
            [ 0,  0,  0,  1.0],
            [ 0,  0,  0,  0],
            [ 0,  0,  1.0,  0]])

# Do some computation with that input
B = expm(A)

b1 = B[0:2, 2:4]
b2 = B[2:4, 2:4].T

# Compute and Print the desired output
print "The innocent but wrong answer:"
print b2 * b1

print "The answer I should get:"
print matrix(b2) * matrix(b1)

実行すると、次のようになります。

The innocent but wrong answer:
[[-0.16666667 -0.5       ]
 [ 0.          1.        ]]
The answer I should get, since I expected everything to still be matrices:
[[ 0.33333333  0.5       ]
 [ 0.5         1.        ]]

この種の混同を避けるためのヒントやアドバイスはありますか? 変数がまだ行列であることを確認するために、matrix() 呼び出しで変数をラップし続けるのは本当に面倒です。この点に関しては標準がないように思われるため、検出が困難なバグにつながる可能性があります。

4

2 に答える 2

18

私はいくつかの理由でinのarray代わりに使用する傾向があります:matrixnumpy

  1. matrixは厳密に 2D ですがnumpy array、任意の次元を持つことができます。
  2. いくつかの違いを除けば、array操作matrixはMatlab ユーザーにとってほとんど交換可能です。
  3. array一貫して使用する場合は、行列の乗算numpy.dot()に (または Python 3.5 では新しい二項演算子) を使用します。@これにより、コードで実際に何が行われるかがわからないという問題が回避*されます。また、乗算エラーが発生した場合は、実行しようとしている乗算の種類が確実であるため、問題を簡単に見つけることができます。

したがってnumpy.array、 に固執することをお勧めしますが、 と の違いにも注意してarrayくださいmatrix

最後に、bpythonnumpy/scipyで作業するのは楽しいことでした。自動プロンプトを使用すると、使用しようとしている関数のプロパティを、常にドキュメントを参照するよりもはるかに速いペースで学習できます。numpy/scipy

編集:array vs の違いmatrixは、おそらくここで最もよく答えられます: 'array' or 'matrix'? どちらを使用する必要がありますか?

于 2012-08-19T07:34:08.593 に答える
6

行列と通常の ndarray を混在させることは確かに難しい場合があり、多くの場合、手間をかける価値はありません。他のポスターを支持し、アレイに固執することをお勧めします。

それにもかかわらず、あなたの特定の例では、問題はexpm. ドキュメントによると、ndarray引数として通常を取り、ndarray を出力します。出力を に戻したい場合はmatrix、次を使用できます。

B = matrix(expm(A))

また

B = expm(A).view(matrix)

Bは行列であり、のスライスはB行列自体になり、乗算は期待どおりに機能します。

したがって、関数の出力の型を常にチェックすることをお勧めします。

于 2012-08-19T11:04:10.870 に答える