我正在开发的科学/工程应用程序有很多线性代数矩阵乘法,因此我使用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()调用中不断地 Package 变量以确保它们仍然是矩阵,这真的很麻烦。似乎在这方面没有标准,因此可能会导致难以检测的bug。
2条答案
按热度按时间luaexgnf1#
我倾向于在
numpy
中使用array
而不是matrix
,原因如下:matrix
是严格二维的,而numpy
array
可以是任何维度。1.除了一些不同之外,
array
和matrix
操作对于Matlab用户来说几乎是interchangeable。1.如果您一直使用
array
,则应该使用numpy.dot()
(或者在Python 3.5中是新的@
二元运算符),这将避免不确定*
在代码中实际上做了什么的问题,并且当遇到乘法错误时,你可以更容易地找到问题,因为你是肯定的什么样的乘法你试图执行。所以我建议您尽量坚持使用
numpy.array
,但也要记住array
和matrix
之间的区别。最后,我发现在bpython上使用
numpy/scipy
是一件快乐的事情,自动提示可以帮助你更快地了解你正在尝试使用的函数的属性,而不是不断地查阅numpy/scipy
文档。编辑:
array
与matrix
之间的区别可能在这里得到最好的回答:* “数组”还是“矩阵”?我应该使用哪个?*bvn4nwqk2#
混合矩阵和常规ndarray确实很棘手,而且往往不值得这么麻烦。我会附议其他海报,并建议您坚持使用数组。
然而,在您的特定示例中,问题来自
expm
。根据文档,它接受常规ndarray
作为参数并输出ndarray。如果您想将输出转换回matrix
,可以用途:或
现在,
B
是一个矩阵,B
的切片本身就是矩阵,您的乘法将按预期工作。因此,建议总是检查函数输出的类型。