如何获取两个数组中对应行的点积?
我该怎么做才能不使用for循环,而只用numpy的函数呢?
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 = []
for x, y in zip(arr_x, arr_y):
res.append(np.dot(x, y))
np.array(res) # array([14, 77])
我试过用tensordot
,设置轴为1,但出现了形状不匹配的错误。
2 个回答
1
试试 (arr_x*arr_y).sum(1)
解释一下:(arr_x*arr_y)
是把每个向量的元素相乘,然后 sum(1)
就是把这些乘出来的结果加起来,跟点积的计算方式一样。
1
除了@hmn Falahi的回答,那个方法很好用,你还可以考虑一种更直观的方式:两个数组的点积其实就是这两个向量中每一对元素相乘后的总和。根据这个定义,你可以简单地用下面的代码得到res
:
res = (arr_x * arr_y).sum(axis=1)
我还附上了另一个我喜欢的解决方案,不过这个方法可能在内存使用上不太高效,可能不太适合你的需求:
res = np.diag(arr_x @ arr_y.T)
这个方法也很直观,它是基于对你手头两个矩阵相乘后的结果取对角线。