混合numpy矩阵和阵列的危险

Ham*_*mid 12 python arrays numpy matrix

我正在研究的科学/工程应用有很多线性代数矩阵乘法,因此我使用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)
Run Code Online (Sandbox Code Playgroud)

跑步时你得到:

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.        ]]
Run Code Online (Sandbox Code Playgroud)

关于如何避免这种混淆的任何提示或建议?将变量包装在matrix()调用中以确保它们仍然是矩阵非常麻烦.在这方面似乎没有标准,因此它可能导致难以发现的错误.

K Z*_*K Z 18

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

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

所以我建议你试着坚持numpy.array,还要牢记之间的差异arraymatrix.

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

编辑:array vs 之间的区别matrix可能是最好的答案:'array'或'matrix'?我应该使用哪个?


Pie*_* GM 6

混合矩阵和常规ndarray确实很棘手,通常不值得麻烦.我会其他第二张海报,并建议你坚持阵列.

然而,在您的特定示例中,问题来自expm.根据文档,它需要一个常规的ndarray参数并输出一个ndarray.如果要将输出转换回matrix,可以使用:

B = matrix(expm(A))
Run Code Online (Sandbox Code Playgroud)

要么

B = expm(A).view(matrix)
Run Code Online (Sandbox Code Playgroud)

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

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