如何解决如何处理python图中的未知标签和边缘
我有两个数组,a和b。我想画一个networkx
图,将彼此靠近的值组合在一起,并相应地标记它们。知道怎么做吗?
解决方法
查找紧密对
您的算法找到了b
到a
的每个点的最接近点,但是您需要在距离阈值(在大多数情况下可能是空的)内确定它们的列表。可以借助scipy.spatial.KDTree
来实现:
import numpy as np
from scipy.spatial import KDTree
from itertools import chain
def nearby_pts(a,b,distance):
# indices of close points of `b` for each point of `a`
a_data,b_data = np.expand_dims(a,axis=1),np.expand_dims(b,axis=1)
idx = KDTree(b_data).query_ball_point(a_data,r=distance)
return idx
然后,您会找到连接从a
到b
的闭合点索引对的边。无法完全矢量化,但我已尽力而为:
def close_pairs(a,distance):
pts = nearby_pts(a,distance).tolist()
pts_flatten = list(chain(*pts))
idx = np.repeat(np.arange(len(pts)),[len(n) for n in pts])
return np.c_[idx,pts_flatten]
输出:
>>> close_pairs(a,distance=150)
[[0,12],[1,11],[2,13],[3,7],[5,10],15],[6,8],[7,1],[8,2],[9,3],14],[10,0],[11,6],[12,4],[13,5],[14,[15,10]]
绘制图形
现在,您可以根据发现的边缘创建图形,但是首先需要重新标记节点的第二部分(b
),以免与a
部分重复。因此,您只需将len(a)
添加到b
的节点索引中即可,
import igraph as ig
pairs_relabel = close_pairs(a,distance=150) + [0,len(a)]
g = ig.Graph(n = len(a) + len(b))
g.add_edges(pairs_relabel)
pal = ig.drawing.colors.ClusterColoringPalette(2) #number of colors used is 2
color = pal.get_many([0]*len(a)+[1]*len(b)) #tags of colors
labels = np.r_[a.astype(int),b.astype(int)] #labels are integral values of nodes
ig.plot(g,bbox=(500,300),vertex_size=24,vertex_color = color,vertex_label_size=9,vertex_label = labels)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。