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方向上的点。解决该问题的任何帮助将不胜感激!
答案 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)
您将得到想要的东西。
答案 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