同点积在lis中的结果

2024-07-04 09:06:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个sympy矩阵,U和{}:

>> U
<< Matrix([
   [1.0,   0,   0,   0],
   [  0, 1.0,   0,   0],
   [  0,   0, 1.0,   0],
   [  0,   0,   0, 1.0]])
>> B
<< Matrix([
   [sqrt(2)/2,  0.5*sqrt(2)*I,             0,          0],
   [        0,              0, 0.5*sqrt(2)*I,  sqrt(2)/2],
   [        0,              0, 0.5*sqrt(2)*I, -sqrt(2)/2],
   [sqrt(2)/2, -0.5*sqrt(2)*I,             0,          0]])

对它们应用点积会生成一个列表,而不是4x4矩阵:

^{pr2}$

相比之下,numpy似乎做了正确的事情:

>> numpy.dot(sympy.matrix2numpy(U),sympy.matrix2numpy(B))
<< array([[0.5*sqrt(2), 0.5*sqrt(2)*I, 0, 0],
   [0, 0, 0.5*sqrt(2)*I, 0.5*sqrt(2)],
   [0, 0, 0.5*sqrt(2)*I, -0.5*sqrt(2)],
   [0.5*sqrt(2), -0.5*sqrt(2)*I, 0, 0]], dtype=object)

我做错什么了?这是预期的行为吗?在


Tags: numpy列表object矩阵sqrt事情arraymatrix
2条回答

SymPy使用*操作进行矩阵乘法,即,您希望使用:

U*B

# Matrix([
# [0.5*sqrt(2),  0.5*sqrt(2)*I,             0,            0],
# [          0,              0, 0.5*sqrt(2)*I,  0.5*sqrt(2)],
# [          0,              0, 0.5*sqrt(2)*I, -0.5*sqrt(2)],
# [0.5*sqrt(2), -0.5*sqrt(2)*I,             0,            0]])

如您所见,元素与您的列表相同,但具有所需的结构。在

与NumPy不同,在SymPy中,dot表示向量的点积。它的设计使你可以得到两个行或列向量的点积,而不必担心使用.T,但也许这里的形状有点松散,因为它实际上是取list(U)list(B)的点积。在

可能是这里太松懈了。我为此打开了一个SymPy issue。在这种情况下,SymPy提出一个例外是更正确的。在

正如@Wrzlprmft正确指出的那样,SymPy使用*来乘法矩阵(如果使用的是python3.5或更高版本,则使用@)。在

相关问题 更多 >

    热门问题