Цикл, хотя и взаимосвязанных компонентов в networkx и экстракт компоненты, которые содержат определенные узлы


У меня есть очень большая неориентированная сеть, загруженная в NetworkX graph(), которая состоит из многих несвязанных компонентов. У меня также есть набор узлов, представляющих интерес, загруженных в набор. Я хотел бы просмотреть весь экстракт, все компоненты которого содержат хотя бы один из интересующих узлов.

# create empty graph
g = nx.Graph()

# add edges to the graph
g.add_edges_from([['a','b'],['a','c'],['b','c'],['d','e'],['e','f'],['d','f'],['g','h'],['g','i'],['h','i']])

# load nodes of interest into a set
interest_nodes = set(['a', 'b', 'f'])

# number of connected components
nx.number_connected_components(g)

# loop through each connected component and add all of the edges for that component to a list if a node in that component is found in the interest_nodes
interest_edges = []
for i in nx.connected_component_subgraph(g):
    for u in i.edges():
        if u in interest_nodes:
            interest_edges.append(u)
Тем не менее, я получаю обратно пустой список.

В идеале я хотел бы получить список со всеми ребрами в любом Связном компоненте, который содержит хотя бы один из узлы в наборе interest_nodes. То, что я должен получить обратно внизу, но вместо этого я ничего не получаю обратно.

interest_edges = [('a', 'c'),
                  ('a', 'b'),
                  ('c', 'b'),
                  ('e', 'd'),
                  ('e', 'f'),
                  ('d', 'f')]
2 2

2 ответа:

Вы близки. Самый простой способ-проверить каждый компонент, чтобы увидеть, перекрываются ли наборы узлов, проверяя длину пересечения набора.

import networkx as nx

g = nx.Graph([['a','b'],['a','c'],['b','c'],['d','e'],['e','f'],['d','f'],['g','h'],['g','i'],['h','i']])

interest_nodes = set(['a', 'b', 'f'])

interest_edges = []
for component in nx.connected_component_subgraphs(g):
    if len(set(component) & interest_nodes) > 0:
        interest_edges.extend(component.edges())

print interest_edges
# output
# [('a', 'c'), ('a', 'b'), ('c', 'b'), ('e', 'd'), ('e', 'f'), ('d', 'f')]

Функция connected_commonent_subgraph () работает не так, как я ожидал бы. В качестве обходного пути можно перебрать все подключенные компоненты и добавить все интересующие узлы плюс подключенные узлы в новый список заинтересованных.

Затем сделайте петлю по вашим краям.

interest_nodes = set(['a', 'b', 'f'])

interest_nodes_plus_connected = []
for c in nx.connected_components(g):
    for n in interest_nodes:    
        if n in c:
            for node in c:
                interest_nodes_plus_connected.append(node)

interest_nodes_plus_connected = set(interest_nodes_plus_connected)

interest_edges = []
for e in g.edges():
    for n in interest_nodes_plus_connected:
        if n in str(e[0]) or n in str(e[1]):
            interest_edges.append(e)
for ie in interest_edges:
    print ie