【问题标题】:dot product of a tuple in pythonpython中元组的点积
【发布时间】:2014-10-21 20:23:52
【问题描述】:

我了解可以通过以下方式找到点积:

>>> vector1 = (2,3,5)
>>> vector2 = (3,4,6)
>>> sum(p*q for p,q in zip(vector1, vector2))
48

但我试图找到一个元组的点积说:

>>> vector3 = ((2,2),(3,3),(5,5))
>>> vector4 = ((3,3),(4,4),(6,6))

如何在不使用 numpy 的情况下做到这一点。

我不能只使用像sum(p*q for p,q in zip(vector3, vector4)) 这样的语句吗?

因为当我尝试相同的时候,我得到一个错误如下:

>>> vector3 = ((2,2),(3,3),(5,5))
>>> vector4 = ((3,3),(4,4),(6,6))
>>> sum(p*q for p,q in zip(vector3, vector4))

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    sum(p*q for p,q in zip(vector1, vector2))
  File "<pyshell#5>", line 1, in <genexpr>
    sum(p*q for p,q in zip(vector3, vector4))
TypeError: can't multiply sequence by non-int of type 'tuple'
>>> 

如何解决?

【问题讨论】:

标签: python dot-product


【解决方案1】:

我认为这里的问题是您尝试做的事情在数学上没有明确定义。你希望这如何工作?正确的输出应该是什么?

您的vector3vector4 实际上是2 by 3 形式的矩阵。这些不是坐标向量。您不能对它们应用点积。您可以将点积运算应用于vector1vector2,因为它们的形式为1 by n:它们是列向量。您不能将点积应用于不是列向量的任何内容。

【讨论】:

    【解决方案2】:

    如果您认为 vector3vector4 本质上是向量列表,您可以这样做:

    (sum(p * q for p, q in zip(a, b)) for a, b in zip(vector3, vector4))
    

    如果您想要一个点积值列表,您可以将上述生成器对象的求值强制转换为列表或使用列表推导:

    # Evaluate into list
    list(sum(p * q for p, q in zip(a, b)) for a, b in zip(vector3, vector4))
    
    # List comprehension
    [sum(p * q for p, q in zip(a, b)) for a, b in zip(vector3, vector4)]
    

    您收到该错误是因为您尝试将 * 运算符应用于两个未定义的元组。

    【讨论】:

    • 它给了我一个错误 at 0x877020c>
    • @AnakataAndrese 这不是错误。这是返回值的字符串表示形式。如果你想看成一个列表,使用内置的list函数...list(sum(p * q for p, q in zip(a, b)...vector4))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 2016-07-13
    相关资源
    最近更新 更多