在numpy中找到n个点与m个点之间的平方距离

3
我有两个numpy数组(称为XY),每一行代表一个点向量。
我想找到每个点在X中到Y中每个点的平方欧几里得距离(将其称为“dist”)。
我希望输出为矩阵D,其中D(i,j)dist(X(i), Y(j))
以下是基于http://nonconditional.com/2014/04/on-the-trick-for-computing-the-squared-euclidian-distances-between-two-sets-of-vectors/的Python代码。
def get_sq_distances(X, Y):
    a = np.sum(np.square(X),axis=1,keepdims=1)
    b = np.ones((1,Y.shape[0]))
    c = a.dot(b)
    a = np.ones((X.shape[0],1))
    b = np.sum(np.square(Y),axis=1,keepdims=1).T
    c += a.dot(b)
    c -= 2*X.dot(Y.T)
    return c

我正在尝试避免循环(应该吗?),并使用矩阵乘法进行快速计算。

但是,当大数组出现“内存错误”时,我遇到了问题。也许有更好的方法来解决这个问题?


@cel 这只涉及两个点之间。 - member555
1
@cel 很好,但是这是在一个矩阵中的所有点之间..我有两个矩阵。 此外,对我来说,同一矩阵中的点之间的距离并不重要。 - member555
如果您连接X和Y,可以使用cel的信息,尽管这样做并不高效,因为您将会计算X到X和Y到Y的距离。 - Mad Physicist
1
几乎是 https://dev59.com/IHI-5IYBdhLWcg3wZ3jC 的完全副本(尽管是针对平方欧几里得距离的)。 - ali_m
我清理了我的尝试。它们并没有真正有帮助。 - cel
2个回答

8

Scipy有一个cdist函数,可以完全满足您的需求:

from scipy.spatial import distance
distance.cdist(X, Y, 'sqeuclidean')

上面链接的文档有一些很好的例子。

1
实际上是 'sqeuclidean' - Adam Acosta
好的,双方都做得很好。已经修复。 - Mad Physicist
它在后台使用矩阵乘法吗?@AdamAcosta - member555
@member555 确实使用矩阵乘法,使用np.dot,可以在这里的源代码中看到。 - piedpiper

1

对列表进行减法运算,然后将结果平方,最后求和。

import numpy as np
def get_sq_distances(a,b):
    return np.sum(np.square(np.subtract(a,b)))
print(get_sq_distances([5,7,9],[4,5,6]))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接