我正在处理一个与科学/工程相关的应用程序,其中有很多线性代数矩阵乘法,因此我使用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()调用来确保它们仍然是矩阵会让代码变得非常混乱。似乎在这方面没有标准,因此可能会导致难以检测的错误。
numpy.dot
而不是依赖于矩阵重载乘法运算符。明确比隐含更好。 - David Cainsqueeze
来减少维度(例如[[1]])可能会很麻烦。 - Hamid