初始化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)#返回最近邻的列表