2

我有两个矩阵 - U 和 V,每个矩阵都有 n 个向量,如下所示:

U = [u1, u2, u3,... un]
V = [v1, v2, v3,... vn]

(实际上 U 和 V 是 2d numpy 数组,向量 u1..un 和 v1...vn 是 1d)

我想创建一个 n 值的一维 numpy 数组:

W = [dot(u1, v1), dot(u2, v2), dot(u3, v3),..., dot(un, vn)]

(点 = 点积)

目前我用numpy的einsum做到这一点:

W = np.einsum('ij,ij->i', U, V)

但是,我的矩阵很大,计算重复了很多次(使用不同的 U 和 V),所以我试图找到让它更快的方法。

我知道 np.einsum 可能有更快的替代方案,例如利用并行性的np.dotnp.tensordoteinsum2(而 np.einsum 是顺序的)。但我没有设法获得相同的功能 - 使用 np.dot 和 np.tensordot 输出是一个二维矩阵,其中包含比我需要的更多点积的结果。

我也开始研究NumExpr,但没有找到一种方法来以一种优雅的方式实现我所需要的,并且没有比所需更多的点积。

如果有人知道在我的用例中提高 einsum 性能的方法,我将不胜感激。

4

0 回答 0