【问题标题】:sympy dot product results in a listsympy 点积产生一个列表
【发布时间】:2017-12-15 20:05:04
【问题描述】:

我有两个 sympy 矩阵,UB

>> 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)

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

【问题讨论】:

    标签: python matrix sympy dot-product


    【解决方案1】:

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

    这里可能太松懈了。我为此开了一个SymPy issue。在这种情况下,SymPy 引发异常会更正确。

    正如@Wrzlprmft 正确指出的那样,SymPy 使用* 来乘以矩阵(如果您使用的是 Python 3.5 或更高版本,则使用@)。

    【讨论】:

    • 非常感谢您的解释和提交问题!
    【解决方案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]])
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-07
      • 2022-11-17
      • 2015-12-07
      • 2017-12-28
      • 1970-01-01
      • 2016-05-28
      • 2015-12-16
      • 2020-10-31
      相关资源
      最近更新 更多