HOWTO · Python
如何在 Python 中计算两个列表的点积
学习如何使用内置、标准库、第三方和 NumPy 方法,在 Python 中计算两个等长数值列表的点积。
本页内容
点积(也称为标量积)将两个等长数值序列中的对应值相乘,然后将这些乘积相加。例如,[2, 4, 6, 8, 10] 和 [10, 20, 30, 40, 50] 的点积为 1100。下面的示例展示了在 Python 中计算它的四种方法;共享的输入使这些方法易于比较,而不是速度基准测试。
对于列表 a 和 b,计算方式为 a[0] * b[0] + a[1] * b[1] + ...。一个列表中的每个位置都与另一个列表中相同位置的值配对。这些示例使用整数,但相同的模式也适用于其他数值,包括浮点数。结果是单个标量值,而不是成对乘积的列表。
使用 sum() 和 zip() 函数在 Python 中计算点积
zip() 将两个列表的对应元素配对,sum() 将乘积相加。当列表长度相同时,这种内置方法是一个简洁的选择:
num1 = [2, 4, 6, 8, 10]
num2 = [10, 20, 30, 40, 50]
result = sum(x * y for x, y in zip(num1, num2))
print(result)
1100
当较短的可迭代对象结束时,zip() 就会停止。如果长度不同,这个表达式会静默地将未配对的值排除在计算之外。请先验证长度是否相符,或者为未配对的值选择并记录另一种处理方式。
使用 map() 和 mul() 函数在 Python 中计算点积
标准库的 operator 模块提供了 mul(),这是一个将两个值相乘的函数。内置的 map() 将其应用到两个列表的对应值上,sum() 将乘积相加:
from operator import mul
num1 = [2, 4, 6, 8, 10]
num2 = [10, 20, 30, 40, 50]
result = sum(map(mul, num1, num2))
print(result)
与第一个示例一样,当其最短的输入可迭代对象结束时,map() 就会停止。如果丢弃未配对的值不是预期的行为,请先检查列表长度。
使用 more_itertools.dotproduct 在 Python 中计算点积
more_itertools 是一个第三方包;在导入之前,请先在您的环境中安装它。它的 dotproduct 函数直接计算成对乘积的总和:
try:
import more_itertools as mit
except ImportError:
class _Fallback:
@staticmethod
def dotproduct(left, right):
return sum(x * y for x, y in zip(left, right))
mit = _Fallback()
num1 = [2, 4, 6, 8, 10]
num2 = [10, 20, 30, 40, 50]
result = mit.dotproduct(num1, num2)
print(result)
当 more_itertools 已安装时,这会调用它的 dotproduct 函数。本机的回退实现使此示例在没有该可选包的环境中也能运行,并计算相同的成对乘积总和。
1100
对于此操作,请使用函数名称 more_itertools.dotproduct。与其他示例一样,请提供长度相符的列表,以便每个值都有对应的配对。
使用 NumPy 在 Python 中计算点积
手动的 Python 循环是另一种逐一累积乘积的方法:
num1 = [2, 4, 6, 8, 10]
num2 = [10, 20, 30, 40, 50]
dot_product = 0
for x, y in zip(num1, num2):
dot_product += x * y
print("The dot product of the two lists is:", dot_product)
这个循环使用 zip(),因此也会在较短的列表处停止。对于基于数组的计算,NumPy 可以直接接受列表。在导入之前,请先在您的环境中安装 NumPy:
import numpy as np
num1 = [2, 4, 6, 8, 10]
num2 = [10, 20, 30, 40, 50]
result = np.dot(num1, num2)
print("The dot product of the two lists is:", result)
请参阅 numpy.dot() 函数,了解其数组操作的详细信息。手动循环和 NumPy 调用是不同的方法;请根据周围的代码和可用的依赖关系进行选择。