微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何处理python图中的未知标签和边缘

如何解决如何处理python图中的未知标签和边缘

我有两个数组,a和b。我想画一个networkx图,将彼此靠近的值组合在一起,并相应地标记它们。知道怎么做吗?

解决方法

查找紧密对

您的算法找到了ba的每个点的最接近点,但是您需要在距离阈值(在大多数情况下可能是空的)内确定它们的列表。可以借助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

然后,您会找到连接从ab的闭合点索引对的边。无法完全矢量化,但我已尽力而为:

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)

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。