You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点积的矩阵泛化:基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:13:49