在点列表中找到第5个最接近点到每个点的距离

时间:2019-03-21 18:46:36

标签: python python-3.x numpy

 xy[0].sort()
 DT=[]
 for i in range(5982):
       xf=np.abs(xy[0][i]-xy[0][i+1])
       yf=np.abs(xy[1][i]-xy[1][i+1])
       D=((xf**2)+(yf**2))**0.5
       DT.append(D)`

 DT.sort()
 R5=[]
 for i in range(5977):
    R=np.abs(DT[i]-DT[i+4])
    R5.append(R)`

正如标题所示,我试图找到列表xy中每个点的第5个最接近的点,该点包含形状中的所有点(2,5983),但是Im使用的方法返回第5个最接近的点距离,而不考虑x和y方向上的点。解决该问题的任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:0)

使用:

from scipy.spatial.distance import pdist,squareform
Y = pdist(xy, 'euclidean')

示例:

>>a = [[1,2],[3,4],[5,6]]
>>Y = pdist(a, 'euclidean')
>>Y
array([2.82842712, 5.65685425, 2.82842712])

第一个元素是a0和a1之间的距离,第二个元素是a0和a2之间的距离,第三个元素是a1和a2之间的距离。

或者您可以使用正方形形式:

>>square = squareform(pdist(a))
>>square
array([[0.        , 2.82842712, 5.65685425],
       [2.82842712, 0.        , 2.82842712],
       [5.65685425, 2.82842712, 0.        ]])

之后,使用:

np.argsort(square)

您将得到想要的东西。

检查pdist documentation

答案 1 :(得分:0)

如果我正确理解了您想要的内容,那么应该为您提供第五个最接近的索引:

<timestamp1> <user1>-<jobclass1> <n> <user2>-<jobclass2> <n> <user3>-<jobclass3> <n> ...
<timestamp2> <user1>-<jobclass1> <n> <user2>-<jobclass2> <n> ...    
<timestamp1> <user1>-<jobclass1> <n> <user2>-<jobclass2> <n> <user3>-<jobclass3> <n> <user4>-<jobclass4> <n>...

如果xy的形状(样本,尺寸)有效,那么我正在使用运输工具。否则,它将使迭代的可读性降低。但是您可以更改此设置。您可以计算所有距离为1的距离,无需执行sqrt,因为sqrt是单调的,并且您仅在寻找订单。然后,我使用第6个元素(索引5),因为为简单起见,我没有跳过距离为0的自我。希望这会有所帮助并且很清楚

答案 2 :(得分:0)

尽量不要更改您的代码。第一部分计算每对点之间距离的平方(如塔克拉底所指出的,平方根是单调的)。然后,它找到每个点的第五个最接近的点,并返回一个数组,其中第i个元素是该点i的第五个最接近的点。

DT = []
    for i in range(5983):
        d_i = []
        for j in range(5983):
            xf=np.abs(xy[0][i]-xy[0][j])
            yf=np.abs(xy[1][i]-xy[1][j])
            d_ij =(xf**2)+(yf**2)
            d_i.append(d_ij)
        DT.append(d_i)

R5 = []
for i in range(5983):
    R = DT[i].index(sorted(DT[i])[5]) 
    R5.append(R)

print R5