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

如何用Numpy函数实现两个数组对应行的点积(无for循环)

不用for循环计算Numpy数组对应行的点积

你之前用for循环结合np.dot的方式虽然能得到结果,但确实可以用更简洁的Numpy内置操作实现,而且效率更高。先说说你用tensordot(axes=1)报错的原因:当axes=1时,Numpy会把两个数组的最后一维做全点积,比如你的arr_x和arr_y都是(2,3)形状,这么操作会得到一个(2,2)的矩阵(相当于矩阵乘法),不是你要的对应行点积,所以形状不匹配。

下面是几种靠谱的实现方式:

方法1:元素相乘后按行求和

这是最直观的方式,对应行元素逐个相乘,再沿行维度求和:

import numpy as np
arr_x = np.array([[1,2,3], [4,5,6]])
arr_y = np.array([[1,2,3], [4,5,6]])

res = (arr_x * arr_y).sum(axis=1)
print(res)  # 输出: [14 77]

方法2:使用np.einsum

einsum可以灵活指定张量的求和方式,语法也很清晰:

res = np.einsum('ij,ij->i', arr_x, arr_y)
print(res)  # 输出: [14 77]

这里'ij,ij->i'的意思是:取两个数组的第i行第j列元素相乘,然后对j维度求和,最终保留i维度的结果。

方法3:矩阵乘法取对角线(不推荐,效率较低)

如果你想用np.dot,可以先做矩阵转置再取对角线,但这种方法会先计算完整的矩阵乘积,效率不如前两种:

res = arr_x.dot(arr_y.T).diagonal()
print(res)  # 输出: [14 77]

至于tensordot,它更适合处理高维张量的点积,对于这种对应行的操作,前两种方法更直接好用。

内容的提问来源于stack exchange,提问作者BBloggsbott

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:06:04