找到一对索引值,使两个网格和一个列之间的欧几里得距离最小化

2024-06-02 05:34:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我想找到这两个,在一个meshgrid中找到一对值和它们的索引号,a与另一对值接近。假设我有两个向量a= np.array([0.01,0.5,0.9])b = np.array([0,3,6,10])和两个网格X,Y = np.meshgrid(a,b)。为了便于说明,它们如下所示:

X= array([[ 0.1,  0.5,  0.9],
         [ 0.1,  0.5,  0.9],
         [ 0.1,  0.5,  0.9],
         [ 0.1,  0.5,  0.9]])

Y =array([[ 0,  0,  0],
         [ 3,  3,  3],
         [ 6,  6,  6],
         [10, 10, 10]])

现在,我有另一个数组,名为c,维数为(2xn)。为了便于说明,假设c包含以下条目:

^{pr2}$

x表示c的列向量。对于每个向量x我想找到 ^{$img1}

更复杂的是,事实上,我不仅在寻找距离最小(I,j)的索引,而且还寻找第二个最小距离(I',j')的索引。在

到目前为止,我所有的方法都是非常复杂的,而且涉及到很多旁道。有人知道如何有效地解决这个问题吗?在


Tags: 方法网格距离np条目数组array向量
2条回答

这是一个评论而不是一个答案,但我喜欢[。。。感谢删除了许多内容,您仍然可以使用修订历史查看这些内容…]

完成修订

作为我自己评论的后续,请看以下内容

设置

In [25]: from numpy import *
In [26]: from scipy.spatial import KDTree
In [27]: X= array([[ 0.1,  0.5,  0.9],                                                
         [ 0.1,  0.5,  0.9],                                                  
         [ 0.1,  0.5,  0.9],
         [ 0.1,  0.5,  0.9]])
In [28]: Y =array([[ 0,  0,  0],                                                      
         [ 3,  3,  3],                                                        
         [ 6,  6,  6],
         [10, 10, 10]])
In [29]: c = array([[ 0.07268017,  0.08816632,  0.11084398,  0.13352165,  0.1490078 ],
           [ 0.00091219,  0.00091219,  0.00091219,  0.00091219,  0.00091219]])

解决方案

两行代码,请注意您必须传递c数组的转置。在

^{pr2}$

评论

为了解释结果,excellent scipy docs通知您,tree.query()返回两个数组,分别包含{}中的每个点

  1. 一个标量或一个长度为k>=2的数组,给出距离 从一点到网格上最近的点,第二个最近的点,等等
  2. 一个标量或一个长度为k>=2的数组,给出索引 指向最近的网格点(下一个网格点等)。在

为了访问网格点,KDTree维护网格数据的副本,例如

In [32]: tree.data[[0,1]]
Out[32]: 
array([[ 0.1,  0. ],
       [ 0.5,  0. ]])

其中[0,1]是第二个输出数组的第一个元素。在

如果需要网格矩阵中最近点的索引,只需使用^{}。在

如果X, Y总是来自meshgrid(),那么你的最小化在{}和{}中是可分离的。只需找到Xc[0,]的最近元素和{}到{}的最接近元素- 你不需要计算二维度量。在

如果a或{}具有统一的步骤,则如果将{}的相应值缩放到索引上,则可以节省更多时间。在您的示例中,all(a == 0.1+0.4*arange(3)),因此您可以通过反转来找到x值:x = (c[0,] - 0.1)/0.4。如果您有一个可逆(可能是非线性)函数,它将整数映射到b上,您同样可以通过将逆函数应用于c[1,]直接找到{}值。在

相关问题 更多 >