python中快速计算不同坐标之间的各个点的欧氏距离,有利于K近邻的计算

 初始化10个坐标,计算每个坐标与其他坐标的欧式距离

import numpy as np
x = np.random.rand(10,2)

#计算10坐标之间的差值(欧氏距离)
L = np.sum((x[:,np.newaxis,:] - x[np.newaxis,:,:]) ** 2, axis = 1)

"""
x[:,np.newaxis,;].shape   10,1,2
x[np.newaxis,:,:].shape    1,10,2
(x[:,np.newaxis,:] - x[np.newaxis,:]).shape  10,10,2
这里使用了广播的规则
x[:,np.newaxis,:] 为[[[a,b]],[[c,d]],[[e,f]],.....[[m,n]]]
x[np.newaxis,:,:] 为[[[a,b],[c,d],[e,f],.....[m,n]]]

brodacast后:
x[:,np.newaxis,:].shape  10,10,2
[[[a,b],[a,b],[a,b]....[a,b]]
 [[c,d],[c,d],[c,d]....[c,d]]
 .
 .
 [[m,n],[m,n],[m,n]...[m,n]]
]
x[np.newaxis,:,:].shap 10,10,2
[[[a,b],[c,d],[e,f]....[m,n]]
 [[a,b],[c,d],[e,f]....[m,n]]
 .
 .
 [[a,b],[c,d],[e,f]....[m,n]]
]

相减之后就是所谓的坐标差,对角线上为0,说明是自己与自己的距离
"""
t = x[:,np.newaxis,:] - x[np.newaxis,:,:]) ** 2
L = np.sum(t, axis = 1).shape 
#L.shape 10, 10。平方是由于欧氏距离的计算公式,sum是x,y轴差值相加
#axis 是指定行进行相加

np.partation(L,2) #第2个位置为第2小的数,前面是小于该位置的数,后面是大于
np.argsort(L,axis = 1)#返回最近邻的列表

 

你可能感兴趣的:(python)