Цикл, хотя и взаимосвязанных компонентов в 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 ответа:
Вы близки. Самый простой способ-проверить каждый компонент, чтобы увидеть, перекрываются ли наборы узлов, проверяя длину пересечения набора.
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