点积的矩阵泛化:基于Numpy实现多向量对逐列内积
用Numpy高效计算多组n维向量的点积
嘿,这个需求完全可以用Numpy的向量化特性优雅解决,根本不用手动写循环——毕竟这正是Numpy最擅长的场景!
我给你推荐两种最自然且高效的实现方式,还附上示例代码,一看就懂:
方法1:逐元素相乘后沿行求和
这是最直观的写法:先让两个矩阵对应位置的元素相乘,然后沿着行方向(也就是axis=0)求和,就能得到每一列向量的点积结果。
示例代码:
import numpy as np # 构造n=3,m=2的示例矩阵(3维向量,共2组) A = np.array([[1, 2], [3, 4], [5, 6]]) B = np.array([[7, 8], [9, 10], [11, 12]]) # 计算对应列的点积 dot_products = np.sum(A * B, axis=0) print(dot_products) # 输出: [ 89 128]
解释一下:A * B会先做逐元素乘法,得到一个和输入同维度的矩阵,然后np.sum(..., axis=0)把每一列的n个元素相加,最终得到长度为m的数组,正好对应m组向量的点积。
方法2:用np.einsum灵活表达维度运算
如果你想更清晰地定义维度之间的运算关系,np.einsum是绝佳选择。它的语法可以直接描述“对n维度求和,保留m维度”的逻辑:
示例代码:
dot_products = np.einsum('nm,nm->m', A, B) print(dot_products) # 输出: [ 89 128]
这里的'nm,nm->m'表示:
- 第一个矩阵的维度是n行m列,第二个矩阵同理;
- 我们要对两个矩阵中对应位置的元素相乘,然后把n维度的结果求和,最终输出m维度的结果——完美匹配我们的需求!
避坑提醒:别用矩阵乘法取对角线
虽然你可以通过np.diag(A.T @ B)得到结果,但这种方法会先计算所有列向量之间的点积(得到m×m的矩阵),再取对角线元素,完全是做了多余的计算,当m很大时性能会很差,所以不推荐。
这两种方法都是纯向量化操作,底层由C实现,比Python循环快几个数量级,完全符合你利用Numpy特性的需求~
内容的提问来源于stack exchange,提问作者Cindy Almighty
相关产品推荐
相关产品推荐

