列表中的 sympy 点积结果
sympy dot product results in a list
我有两个 sympy 矩阵,U
和 B
:
>> 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 矩阵:
>> U.dot(B)
<< [0.5*sqrt(2),
0,
0,
0.5*sqrt(2),
0.5*sqrt(2)*I,
0,
0,
-0.5*sqrt(2)*I,
0,
0.5*sqrt(2)*I,
0.5*sqrt(2)*I,
0,
0,
0.5*sqrt(2),
-0.5*sqrt(2),
0]
相比之下,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)
我做错了什么?这是预期的行为吗?
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
,但也许这里的形状松散有点多,因为它实际上是取 [= 的点积12=] 和 list(B)
。
大概是这里太松了。为此我开了一个SymPy issue。在这种情况下,SymPy 引发异常会更正确。
正如@Wrzlprmft 正确指出的那样,SymPy 使用 *
乘以矩阵(或者 @
如果您使用 Python 3.5 或更高)。
我有两个 sympy 矩阵,U
和 B
:
>> 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 矩阵:
>> U.dot(B)
<< [0.5*sqrt(2),
0,
0,
0.5*sqrt(2),
0.5*sqrt(2)*I,
0,
0,
-0.5*sqrt(2)*I,
0,
0.5*sqrt(2)*I,
0.5*sqrt(2)*I,
0,
0,
0.5*sqrt(2),
-0.5*sqrt(2),
0]
相比之下,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)
我做错了什么?这是预期的行为吗?
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
,但也许这里的形状松散有点多,因为它实际上是取 [= 的点积12=] 和 list(B)
。
大概是这里太松了。为此我开了一个SymPy issue。在这种情况下,SymPy 引发异常会更正确。
正如@Wrzlprmft 正确指出的那样,SymPy 使用 *
乘以矩阵(或者 @
如果您使用 Python 3.5 或更高)。