私が取り組んでいる科学/工学アプリケーションには、多くの線形代数行列の乗算があるため、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() 呼び出しで変数をラップし続けるのは本当に面倒です。この点に関しては標準がないように思われるため、検出が困難なバグにつながる可能性があります。