Как фильтровать узлы или ребра специальным символом в графе Networkx - PullRequest
2 голосов
/ 18 февраля 2020

У меня есть следующий график NetworkX, G. Я хотел бы фильтровать только узлы, имеющие специальные символы, например (A / B и B / C) или ребра (A / B, B / C), исключая другие ,

enter image description here

Я пробовал с этим, но он печатает всю информацию.

G.nodes()
A,A/B, C, B/C, D

и

G.edges()
(A,A/B),(A,C), (A/B, B/C), (C,B/C), (B/C,D)

Но я бы хотел получить только A/B and B/C, как указано выше, исключая других.

Есть ли способ сделать это в сети x python? Любое решение приветствуется!

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Вы можете отфильтровать узлы, используя следующий код, и просто используйте функцию nx.subgraph , чтобы получить подграф.

import networkx as nx

G = nx.DiGraph()

G.add_edge('A', 'C')
G.add_edge('A', 'A/B')
G.add_edge('A', 'C')
G.add_edge('A/B', 'B/C')
G.add_edge('C', 'B/C')
G.add_edge('B/C', 'D')

# This will pick up nodes containing any
# special character in them
from string import punctuation
special_chars = set(punctuation)

all_nodes = G.nodes()

special_nodes = []
for node in all_nodes:
    for ch in special_chars:
        if ch in node:
            special_nodes.append(node)
            break

H = nx.subgraph(G, special_nodes)

H.nodes()
# NodeView(('A/B', 'B/C'))

H.edges()
# OutEdgeView([('A/B', 'B/C')])
1 голос
/ 18 февраля 2020

Узлы и ребра графа представляют собой структуры в виде списков, поэтому вы можете перебирать их и фильтровать узлы / ребра как список:

import networkx as nx

G = nx.DiGraph()
G.add_edges_from([
    ('A', 'A/B'),
    ('A/B', 'B/C'),
    ('A', 'C'),
    ('B/C', 'D')
])

Фильтровать все узлы с символом B в них:

list(filter(lambda x: 'B' in x, G.nodes))

['B/C', 'A/B']

Фильтровать все узлы с символом / в них (другой способ сделать то же самое):

[n for n in G.nodes if '/' in n]

['B/C', 'A/B']

Отфильтруйте все ребра с символом B в любом узле ребра:

[e for e in G.edges if 'B' in e[0] or 'B' in e[1]]

[('A', 'A/B'), ('B/C', 'D'), ('A/B', 'B/C')]

Фильтровать все ребра с символом / в каждом узле ребра:

[e for e in G.edges if '/' in e[0] and '/' in e[1]]

[('A/B', 'B/C')]

...