【问题标题】:speed up in finding nearst points and sorting them in python加快查找最近点并在 python 中对它们进行排序
【发布时间】:2019-08-09 04:46:44
【问题描述】:

我在 2D 空间中有 N 个点(N 行,2 列),我想为点集中的每个点 (x_n,y_n) 找到最近的 k 个点,然后对它们进行排序。这是用于此目的的代码。我想加快以下代码:

def nearst_sort(x,y,k):
    N = len(x)    
    A = np.zeros((N,k))
    R = np.zeros((N,N))
    R = (x - x[np.newaxis].transpose())**2 + (y -y[np.newaxis].transpose())**2
    ix = np.argsort(R, kind='stable')
    ix = ix.transpose()
    A=ix[0:k,:].transpose()
    return A

我的样本数据如下:

x   y
0   0
0   0.5
0   1
0.5 0
0.5 0.5
0.5 1
1   0
1   0.5
1   1

我也尝试过 scipy.spatial.KDTree 中的函数,但没有得到好的结果。任何帮助,将不胜感激。

【问题讨论】:

    标签: python-3.x performance numpy scipy scipy-spatial


    【解决方案1】:

    对我来说,KDTree 要快得多:

    >>> import numpy as np
    >>> from scipy.spatial import cKDTree as KDTree
    >>> from timeit import timeit
    >>> 
    >>> z = np.random.randn(1000, 2)
    >>> k = 5
    >>> 
    >>> KDTree(z).query(z, k)
    (array([[0.        , 0.21130505, 0.22903208, 0.32009477, 0.38000444],
           [0.        , 0.03969915, 0.06698214, 0.08423566, 0.10740011],
           [0.        , 0.04964421, 0.08194808, 0.11576068, 0.12022531],
           ...,
           [0.        , 0.00721785, 0.03346301, 0.03617199, 0.04193239],
           [0.        , 0.05147871, 0.05619545, 0.08028866, 0.08744349],
           [0.        , 0.03733766, 0.06359033, 0.06861222, 0.0698981 ]]), array([[  0, 391, 134, 462, 575],
           [  1,  87, 879, 846, 122],
           [  2, 793, 314, 564, 483],
           ...,
           [997, 390, 432, 165, 952],
           [998, 194, 457, 775, 629],
           [999, 158, 522, 862, 791]]))
    >>> nearst_sort(*z.T, k)
    array([[  0., 391., 134., 462., 575.],
           [  1.,  87., 879., 846., 122.],
           [  2., 793., 314., 564., 483.],
           ...,
           [997., 390., 432., 165., 952.],
           [998., 194., 457., 775., 629.],
           [999., 158., 522., 862., 791.]])
    >>> timeit(lambda: KDTree(z).query(z, k), number=100)
    0.12790076900273561
    >>> timeit(lambda: nearst_sort(*z.T, k), number=100)
    6.5285790269990684
    

    这是 50 倍。不过,可能取决于示例。

    【讨论】:

    • 如何定义nearst_sort函数?
    • 你的方法很快。但是是否可以修改您的方法以获得与 Nearst_sort 函数的结果完全相同的结果。例如,对于给定的数据,结果是不相等的。即 np.array_equal(ii,jj) 为距离返回 False,ii=KDTree(z,y).query(z, 3), jj=nearst_sort(*zT, 3) 其中 z=(x,y)
    • 那是因为在像您的示例这样的常规网格上会有很多联系,并且它们的排序方式不同。例如,您的代码选择 (0,0);(0,0.5);(0.5,0),而 KDTree 选择 (0,0);(0.5,0);(0,0.5)。显然,这两个答案同样有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2019-09-28
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2020-08-09
    相关资源
    最近更新 更多