如何获取两个数组中对应行的点积?

0 投票
2 回答
70 浏览
提问于 2025-04-14 18:00

我该怎么做才能不使用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)

这个方法也很直观,它是基于对你手头两个矩阵相乘后的结果取对角线。

撰写回答