我有2个(n_samples, n_dimensions)的ndarrays,我想要每对对应的行,所以输出将是(n_samples, )

使用sklearn's implementation得到(n_samples, n_samples)结果-显然进行了许多不相关的计算,这在我的情况下是不可接受的。

使用1 - scipy's implementation是不可能的,因为它需要向量而不是矩阵。

执行所需的最有效方法是什么?

最佳答案

假设两个数组xy具有相同的形状,


使用np.einsumreference)计算逐元素点积
xy的每一行计算L2(欧几里德)范数的乘积
将结果从(1)除以(2)




def matrix_cosine(x, y):
    return np.einsum('ij,ij->i', x, y) / (
              np.linalg.norm(x, axis=1) * np.linalg.norm(y, axis=1)
    )




和一些测试代码;

x = np.random.randn(100000, 100)

%timeit matrix_cosine(x, x)
82.8 ms ± 2.94 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

assert np.allclose(matrix_cosine(x, x), np.ones(x.shape[0]))

关于python - numpy ndarrays中匹配行之间的余弦相似度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49218285/

10-10 02:25