python中元组的点积

时间:2014-10-21 20:23:53

标签: python dot-product

据我所知,点积可以通过以下方式找到:

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

如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

我认为这里的问题是你要做的事情在数学上没有明确定义。你觉得这个怎么样?正确的输出应该是什么?

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

答案 1 :(得分:1)

如果您正在考虑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)]

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