NetworkX中的Ego图

8
我有一个二分图,其中包括节点(a1,a2,...a100, m1,m2,...)。我想找到特定节点(a1、a2和a10)的诱导子图。我可以使用networkx.ego_graph执行此操作,但它一次只处理一个顶点,并返回诱导图。我想知道是否有方法可以同时处理我感兴趣的所有节点,然后选择最大的节点。

谢谢@yatu。这确实可以正常工作。我对其进行了一些小改动以适应我的要求。该解决方案寻找最高程度,但我想获取涉及列表中节点的最大连接组件中节点数(例如[l = [1,'a',6]]),可能还有其他节点与这些节点相连,我也必须考虑它们。因此,我为列表中的每个节点创建了自我图,然后使用Graph.Compose_all创建子图。然后我在组合图上使用connected_components来获取具有最大长度的组件。 - ankshukla
听起来是正确的方法。很高兴它有帮助 :) - yatu
这正是我在过去两天一直在寻找的,对我很有帮助。 - asspsss
1个回答

6

对于一般情况,可以使用nx.ego_graph来获得自我图。

虽然在您的特定情况下,看起来您想在网络中找到最大的诱导自我图。为此,您可以首先找到具有最高度数的节点,然后获取其自我图。


让我们创建一个二分图的示例:

import networkx as nx

B = nx.Graph()
B.add_nodes_from([1, 2, 3, 4, 5, 6], bipartite=0)
B.add_nodes_from(['a', 'b', 'c', 'j', 'k'], bipartite=1)
B.add_edges_from([(1, 'a'), (1, 'b'), (2, 'b'), (2, 'c'), (3, 'c'), (4, 'a'), 
                  (2, 'b'), (3, 'a'), (5, 'k'), (6, 'k'), (6, 'j')])


rcParams['figure.figsize'] = 12, 6
nx.draw(B, node_color='lightblue', 
        with_labels=True)

enter image description here

正如问题中提到的那样,假设我们想从以下节点列表中进行选择:

l = [1,'a',6]

看起来你想在这些中选择具有最高中心度的那个。为此,你可以执行以下操作:

deg_l = {i:B.degree(i) for i in l}    
highest_centrality_node = max(deg_l.items(), key=lambda x: x[1])[0]

现在我们可以使用以下代码绘制相应的ego_graph
ego_g = nx.ego_graph(B, highest_centrality_node)
d = dict(ego_g.degree)
nx.draw(ego_g, node_color='lightblue', 
        with_labels=True, 
        nodelist=d, 
        node_size=[d[k]*300 for k in d])

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接