如何用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
相关产品推荐
相关产品推荐

