python numpy矩阵与数组混用的危险

34gzjxbg  于 2022-12-25  发布在  Python
关注(0)|答案(2)|浏览(115)

我正在开发的科学/工程应用程序有很多线性代数矩阵乘法,因此我使用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。

luaexgnf

luaexgnf1#

我倾向于在numpy中使用array而不是matrix,原因如下:

  1. matrix是严格二维的,而numpyarray可以是任何维度。
    1.除了一些不同之外,arraymatrix操作对于Matlab用户来说几乎是interchangeable
    1.如果您一直使用array,则应该使用numpy.dot()(或者在Python 3.5中是新的@二元运算符),这将避免不确定*在代码中实际上做了什么的问题,并且当遇到乘法错误时,你可以更容易地找到问题,因为你是肯定的什么样的乘法你试图执行。
    所以我建议您尽量坚持使用numpy.array,但也要记住arraymatrix之间的区别。
    最后,我发现在bpython上使用numpy/scipy是一件快乐的事情,自动提示可以帮助你更快地了解你正在尝试使用的函数的属性,而不是不断地查阅numpy/scipy文档。

编辑:arraymatrix之间的区别可能在这里得到最好的回答:* “数组”还是“矩阵”?我应该使用哪个?*

bvn4nwqk

bvn4nwqk2#

混合矩阵和常规ndarray确实很棘手,而且往往不值得这么麻烦。我会附议其他海报,并建议您坚持使用数组。
然而,在您的特定示例中,问题来自expm。根据文档,它接受常规ndarray作为参数并输出ndarray。如果您想将输出转换回matrix,可以用途:

B = matrix(expm(A))

B = expm(A).view(matrix)

现在,B是一个矩阵,B的切片本身就是矩阵,您的乘法将按预期工作。
因此,建议总是检查函数输出的类型。

相关问题