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方向的点。任何有关解决此问题的帮助将不胜感激!
如果我理解你想要什么,这应该给你最接近的第5个索引:
fifth = []
for i in range(len(xy)):
distances = ((xy.T-xy.T[i])**2).sum(axis=1)
fifth.append(np.argsort(distances)[5])
如果xy在形状(样本,尺寸)中,那么我可以使用传输。否则它会使迭代的可读性降低。但你可以改变这一点。你计算所有的距离,没有必要做sqrt,因为sqrt是单调的,你只是在寻找订单。然后我使用第6个元素(索引5),因为为了简单起见,我没有跳过自我,这将是距离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)
你会得到你想要的东西。
尽量不要过多地更改代码。第一部分计算每对点之间距离的平方(正如Tacratis指出的那样,平方根是单调的)。然后它找到每个点的第五个最近点并返回一个数组,其中i
th元素是点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