我正在研究的科学/工程应用有很多线性代数矩阵乘法,因此我使用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()调用中以确保它们仍然是矩阵非常麻烦。在这方面似乎没有标准,因此它可能导致难以发现的错误。
答案 0 :(得分:18)
由于以下几个原因,我倾向于在array
中使用matrix
代替numpy
:
matrix
严格来说是2D,而您可以拥有任何维度的numpy
array
。array
和matrix
操作几乎是interchangeable。 array
,则可以使用numpy.dot()
(或在Python 3.5中使用新的@
二元运算符)进行矩阵乘法。这样可以避免无法确定代码中*
实际执行的操作的问题。当您遇到乘法错误时,您可以更轻松地找到问题,因为您确定要尝试执行何种乘法。因此,我建议您尝试坚持numpy.array
,同时请注意array
和matrix
之间的差异。
最后,我发现在bpython上使用numpy/scipy
感到很高兴。自动提示可帮助您以比以前不断查阅numpy/scipy
文档更快的速度学习您尝试使用的功能的属性。
修改强>
array
与matrix
之间的差异可能是最好的答案:'array' or 'matrix'? Which should I use?
答案 1 :(得分:6)
混合矩阵和常规ndarray确实很棘手,通常不值得麻烦。我会推荐其他海报,并建议你坚持阵列。
尽管如此,在您的特定示例中,问题来自expm
。根据文档,它需要一个常规ndarray
作为参数并输出一个ndarray。如果要将输出转换回matrix
,可以使用:
B = matrix(expm(A))
或
B = expm(A).view(matrix)
现在,B
是一个矩阵,B
的切片本身就是矩阵,你的乘法将按预期工作。
因此,建议是始终检查函数输出的类型。