首页 > 解决方案 > 不同形状阵列的numpy距离计算

问题描述

不确定我的标题是否正确,但基本上我有一个参考坐标,格式为 (x,y,z),还有一个大的坐标列表/数组也采用该格式。我需要得到每个之间的欧几里得距离,所以理论上使用 numpy 和 scipy 我应该能够执行以下操作:

import numpy, scipy.spatial.distance
a = numpy.array([1,1,1])
b = numpy.random.rand(20,3)

distances = scipy.spatial.distance.euclidean(b, a)

但是我没有得到一个数组,而是得到一个错误:ValueError: Input vector should be 1-D.

不知道如何解决这个错误并得到我想要的,而不必求助于循环等,这有点违背了使用 Numpy 的目的。

从长远来看,我想使用这些距离来计算真值掩码,以计算箱中的距离值。

我不确定我只是使用了错误的功能还是使用了错误的功能,我无法在文档中找到可以更好地工作的任何内容。

标签: pythonarraysnumpyscipyeuclidean-distance

解决方案


编写自己的函数来执行此操作实际上并不难 - 这是我的,欢迎您使用。

如果您在大量点上执行此操作并且速度很重要,我猜这个函数将在很长一段时间内击败基于 for-loop 的速度解决方案 - numpy 被设计为在整体上执行操作时高效矩阵。

import numpy
a = numpy.array([1,1,1])
b = numpy.random.rand(20,3)

def euclidean_distances(ref_point, co_ords_array):
    diffs = co_ords_array - ref_point
    sqrd_diffs = numpy.square(diffs)
    sum_sqrd_diffs = numpy.sum(sqrd_diffs, axis = 1)
    euc_dists = numpy.sqrt(sum_sqrd_diffs)
    return euc_dists

推荐阅读