我想计算从一组N个3D点到一组M个3D中心的距离,并将结果存储在NxM矩阵中(其中列i是从所有点到中心i的距离)
示例:
data = np.random.rand(100,3) # 100 toy 3D points
centers = np.random.rand(20,3) # 20 toy 3D points
为了计算所有点和单个中心之间的距离,我们可以使用“广播”,所以我们避免循环所有点:
i = 0 # first center
np.sqrt(np.sum(np.power(data - centers[i,:], 2),1)) # Euclidean distance
现在我们可以将这段代码放在循环遍历所有中心的循环中:
distances = np.zeros(data.shape[0], centers.shape[0])
for i in range(centers.shape[0]):
distances[:,i] = np.sqrt(np.sum(np.power(data - centers[i,:], 2),1))
然而,这显然是一种可以并行化和改进的操作。
我想知道是否有更好的方法(可能是一些多维广播或某些图书馆)。
这是集群和分类的一个非常常见的问题,你希望从数据到一组类的距离,所以我认为它应该是一个有效的实现。
这样做的最佳方法是什么?
答案 0 :(得分:1)
一路广播:
scipy.spatial.KDTree
如果您只想要最近的中心,并且您有很多数据点(很多超过几十万个样本),您可能应该将数据存储在KD树中并使用中心进行查询({ {1}})。