找到一对索引值,它们可以最小化两个网格网格和列向量之间的欧几里德距离

时间:2014-10-22 08:31:12

标签: python arrays numpy scipy distance

我想找到两个在meshgrid中找到一对值及其索引号,即一个壁橱到另一对值。假设我有两个向量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维度(2 x N)的数组。例如,假设c包含以下条目:

c = array([[ 0.07268017,  0.08816632,  0.11084398,  0.13352165,  0.1490078 ],
           [ 0.00091219,  0.00091219,  0.00091219,  0.00091219,  0.00091219]])

c表示x的列向量。对于我想要找到的每个向量x enter image description here

为了使事情复杂化,我实际上不仅寻找具有最小距离(i,j)的索引,而且还寻找第二小的距离(i',j')。

到目前为止,我所有的方法都非常复杂,涉及很多方面的路线。有人知道如何有效地解决问题吗?

2 个答案:

答案 0 :(得分:2)

如果X, Y始终来自meshgrid(),则您的最小化在XY中是可分的。只需找到Xc[0,]的最接近元素以及Yc[1,]的最接近元素--- 您不需要计算二维指标。

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

答案 1 :(得分:1)

这是一个评论而不是一个答案,但我喜欢[...许多东西被仁慈地删除,你仍然可以看到使用修订历史...]

完成修订

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

设置

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数组的转置。

In [30]: tree = KDTree(zip(X.ravel(), Y.ravel()))
In [31]: tree.query(c.T,k=2)                                           
Out[31]: 
(array([[ 0.02733505,  0.4273208 ],
        [ 0.01186879,  0.41183469],
        [ 0.01088228,  0.38915709],
        [ 0.03353406,  0.36647949],
        [ 0.04901629,  0.35099339]]), array([[0, 1],
        [0, 1],
        [0, 1],
        [0, 1],
        [0, 1]]))

评论

要解释结果,excellent scipy docs会通知您tree.query()会为您提供两个数组,分别包含c

中的每个点
  1. 标量或长度为k>=2的数组,为您提供距离 从点到网格上的最近点,第二个最接近的点等,
  2. 标量或长度为k>=2的数组,为您提供索引 指向最接近的网格点(下一个关闭等)。
  3. 要访问网格点,KDTree会保留网格数据的副本,例如

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

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

    如果您需要网格矩阵中最近(s)点的索引,只需使用divmod即可。