当前位置: 首页 > 后端技术 > Python

使用Scipy库函数寻找最近邻点并可视化

时间:2023-03-26 19:34:14 Python

scipy.spatial中的cKDTree类可以将坐标点集合按照距某一位置的距离升序排序,并返回它们的下标和具体的距离值.根据这个特性,你可以找到一个点的最近邻居。下面的代码先随机生成10个二维坐标点,然后用plt.scatter标记它们的位置。然后在一个for循环中找出离他们最近的点(除了自己),用plt.arrow在两者之间加一条带箭头的线。最后,使用plt.text在连接的中心标记这个距离值。图中出现了一些双向箭头,因为它们是彼此最近的邻居。importscipy.spatialassptimportnumpyasnpiportmatplotlib.pyplotaspltplt.rc('font',family='simhei',size=10)#设置中文显示,字体大小plt.rc('axes',unicode_minus=False)#该参数解决负号显示问题points=np.random.randint(1,20,(10,2))#生成10个二维坐标点,x和y的取值范围为[1,20)plt.scatter(x=points[:,0],y=points[:,1],s=150,color='red',marker='o')#标记所有样本点s代表标记的大小注意before两个参数,不是坐标点,而是x坐标的集合(二维矩阵点的第一列)和y坐标的集合(二维矩阵点的第二列)#执行搜索函数tree=spt.cKDTree(data=points)forpointinpoints:distances,indexes=tree.query(point,k=2)#对每个坐标点,找到离它最近的两个点(最近邻就是自己,到被忽略)print('最近的c坐标点到点{}为{},距离为{:.2f}'.format(point,points[indexs[1]],distances[1]))#point代表当前点,point[0]是当前点的x坐标,point[1]是当前点的y坐标#points[indexs[1]]表示其他点中离当前点最近的点,points[indexs[1]][0]和points[indexs[1]][1]表示这个点的x和y坐标x=[point[0],points[indexs[1]][0]]y=[point[1],points[indexs[1]][1]]#plt.plot(x,y,color='black')#没有箭头的连接。注意前两个参数不是坐标点,而是x坐标和y坐标的集合plt.arrow(x=point[0],y=point[1],dx=points[indexs[1]][0]-point[0],dy=points[indexs[1]][1]-point[1],width=0.1,length_includes_head=True,color='green')#箭头线:https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.pyplot.arrow.htmlplt.text(sum(x)/2,sum(y)/2,fontsize=10,s="%.2f"%distances[1])#标记连接线上最短距离的值。因为x是两个点的x坐标集合,sum(x)/2代表这条线的中心位置,写在中间(s代表要写的字符串)plt.show()#显示图像运行程序的结果:1.输出2.可视化