12

我正在研究的科学/工程应用程序有很多线性代数矩阵乘法,因此我使用 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() 调用中继续包装变量以确保它们仍然是矩阵真的很麻烦。这方面似乎没有标准,因此可能会导致难以检测的错误。

4

2 回答 2

18

我倾向于使用array而不是matrixinnumpy有几个原因:

  1. matrix严格来说是二维的,而你可以有numpy array任何维度的。
  2. 除了一些差异之外,对于 Matlab 用户来说arraymatrix操作几乎可以互换。
  3. 如果您array始终使用,那么您将使用numpy.dot()(或在 Python 3.5 中使用新的@二元运算符)进行矩阵乘法。这将防止不确定*代码中实际执行的操作的问题。当你遇到乘法错误时,你可以更容易地找到问题,因为你可以确定你正在尝试执行哪种乘法。

所以我建议你尽量坚持numpy.array,但也要记住和之间的array区别matrix

最后,我发现numpy/scipybpython上工作很愉快。numpy/scipy自动提示可以帮助您以比不断查阅文档更快的速度了解您尝试使用的功能的属性。

编辑:array vs 之间的区别matrix也许在这里得到最好的回答:'array' 还是 'matrix'?我应该使用哪个?

于 2012-08-19T07:34:08.593 回答
6

混合矩阵和常规 ndarray 确实很棘手,而且通常不值得麻烦。我会支持其他海报,并建议您坚持使用数组。

不过,在您的特定示例中,问题来自expm. 根据文档,它需要一个正则ndarray作为参数并输出一个 ndarray。如果要将输出转换回matrix,可以使用:

B = matrix(expm(A))

或者

B = expm(A).view(matrix)

现在,B是一个矩阵,切片B本身就是矩阵,并且您的乘法将按预期工作。

因此,建议始终检查函数输出的类型。

于 2012-08-19T11:04:10.870 回答