当前位置: 首页 > 面试题库 >

两个不同的Numpy数组中的点之间的最小欧几里得距离,不在

伯博
2023-03-14
问题内容

我有两个 x - y 坐标数组,我想找到一个数组中 每个 点与另一个数组中 所有 点之间的最小欧几里得距离。数组的大小不一定相同。例如:

xy1=numpy.array(
[[  243,  3173],
[  525,  2997]])

xy2=numpy.array(
[[ 682, 2644],
[ 277, 2651],
[ 396, 2640]])

我当前的方法遍历每个坐标xyxy1并计算该坐标与其他坐标之间的距离。

mindist=numpy.zeros(len(xy1))
minid=numpy.zeros(len(xy1))

for i,xy in enumerate(xy1):
    dists=numpy.sqrt(numpy.sum((xy-xy2)**2,axis=1))
    mindist[i],minid[i]=dists.min(),dists.argmin()

有没有一种方法可以消除for循环,并以某种方式在两个数组之间进行逐元素计算?我设想生成一个距离矩阵,为此我可以找到每一行或每一列中的最小元素。

看问题的另一种方法。假设我将xy1(length m )和xy2(length p )串联为xy(length n
),并存储原始数组的长度。从理论上讲,我应该能够从这些坐标中生成一个 nxn 距离矩阵,从中可以获取 mxp
子矩阵。有没有一种方法可以有效地生成此子矩阵?


问题答案:

(数月后) scipy.spatial.distance.cdist( X, Y ) 给出了X和Y的所有距离对,2个暗角,3个暗角……
它也有22个不同的范数,在此处详细介绍

# cdist example: (nx,dim) (ny,dim) -> (nx,ny)

from __future__ import division
import sys
import numpy as np
from scipy.spatial.distance import cdist

#...............................................................................
dim = 10
nx = 1000
ny = 100
metric = "euclidean"
seed = 1

    # change these params in sh or ipython: run this.py dim=3 ...
for arg in sys.argv[1:]:
    exec( arg )
np.random.seed(seed)
np.set_printoptions( 2, threshold=100, edgeitems=10, suppress=True )

title = "%s  dim %d  nx %d  ny %d  metric %s" % (
        __file__, dim, nx, ny, metric )
print "\n", title

#...............................................................................
X = np.random.uniform( 0, 1, size=(nx,dim) )
Y = np.random.uniform( 0, 1, size=(ny,dim) )
dist = cdist( X, Y, metric=metric )  # -> (nx, ny) distances
#...............................................................................

print "scipy.spatial.distance.cdist: X %s Y %s -> %s" % (
        X.shape, Y.shape, dist.shape )
print "dist average %.3g +- %.2g" % (dist.mean(), dist.std())
print "check: dist[0,3] %.3g == cdist( [X[0]], [Y[3]] ) %.3g" % (
        dist[0,3], cdist( [X[0]], [Y[3]] ))


# (trivia: how do pairwise distances between uniform-random points in the unit cube
# depend on the metric ? With the right scaling, not much at all:
# L1 / dim      ~ .33 +- .2/sqrt dim
# L2 / sqrt dim ~ .4 +- .2/sqrt dim
# Lmax / 2      ~ .4 +- .2/sqrt dim


 类似资料:
  • 首先,我知道欧几里得距离是什么,以及它在两个向量之间做什么或计算什么。 但我的问题是如何计算两个类对象之间的距离,例如在Java或任何其他OOP语言中。我读了很多关于机器学习的东西,已经使用库等编写了分类器。但我想知道,当我有例如以下对象时,如何计算欧几里德距离: 我已经知道的是(如果我没有错!)我必须将此对象转换为表示属性或“特征”的(n)个向量/数组(在机器学习中称为?) 但我该怎么做呢?这正

  • 返回两点之间的欧氏距离。 使用 Math.hypot() 计算两点之间的欧氏距离( Euclidean distance)。 const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0); distance(1, 1, 2, 3); // 2.23606797749979

  • 问题内容: 我对计算两个numpy数组(x和y)之间的各种空间距离感兴趣。 http://docs.scipy.org/doc/scipy-0.14.0/reference/generation/scipy.spatial.distance.cdist.html 但是,以上结果会产生太多不必要的结果。我如何仅将其限制为所需的结果。 我想计算[1,11]和[31,41]之间的距离;[2,22]和[3

  • 我想写一个函数来计算中的坐标与中的每个坐标之间的欧氏距离,并通过列生成维度行的距离数组(其中是中的坐标数,是中的坐标数)。 NB:为了简单起见,我不想使用任何其他库。 运行该函数将生成: 我一直在试着运行下面的程序 但我得到以下错误: 非常感谢。

  • 我试图将X Y Z变量的数组或列表传递给计算欧几里德距离的方法。 这是我的方法: 这是我的主要代码: 输出为:1.7782794。。应该是10的时候。有什么想法吗?

  • 问题内容: 我在3D中有两点: 我想计算距离: 使用NumPy或一般使用Python的最佳方法是什么?我有: 问题答案: 用途 背后的理论:如数据挖掘导论所述 之所以有效,是因为欧几里得距离为l2范数,并且 中ord参数的默认值为2。