У меня есть неориентированный граф NetworkX, и я хочу найти всех соседей node_a, которые также являются соседями node_b - PullRequest
0 голосов
/ 03 марта 2019

Простые вопросы: как мне найти всех соседей между node_a и node_b и как лучше всего это сделать?

Код, который у меня есть:

my_node_list_a = [ ... ]
my_node_list_b = [ ... ]

for c in my_node_list_a:
    for x in nx.neighbors(G, c):
        for y in my_node_list_b:
            for h in nx.neighbors(G, y):
                 if x in y:
                    print(x)

Thisплохой кодПрежде всего мне нужно вручную заполнить my_node_list_a и my_node_list_b, выполнив for i in G.nodes(): print(i) и поместив в массивы только те узлы, с которыми я хочу запустить цикл.

EDIT :

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

Однако меня также интересует, какие узлы соединяют узлы в массивах my_node_list_a и my_node_list_b, которые имеютбольшее расстояние, чем 1, поэтому, если кто-нибудь может показать мне, как это сделать, было бы также полезно (в основном, показать мне путь (и) между ними)

Дальнейшее редактирование :

Мне нужно создать график из моего основного графика G на основе соседей выбора узлов.

Каков наилучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Чтобы найти общих соседей между двумя узлами, вы можете использовать функцию common_neighbors():

import networkx as nx

G = nx.turan_graph(6, 2)

%matplotlib inline # jupyter notebook
nx.draw(G, with_labels=True)

list(nx.common_neighbors(G, 3, 5))
# [0, 1, 2]

graph

Чтобы найти общих соседей между двумя наборамиузлов (вершин) вы можете использовать функцию node_boundary():

import networkx as nx
from itertools import chain

G = nx.grid_graph(dim=[5, 5])

list_A = [(3, i) for i in range(5)]
list_B = [(1, i) for i in range(5)]
intersec = nx.node_boundary(G, list_A) & nx.node_boundary(G, list_B)
# {(2, 1), (2, 0), (2, 3), (2, 2), (2, 4)}

color = []
for i in G.nodes():
    if i in intersec:
        col = 'green'
    elif i in chain(list_A, list_B):
        col = 'red'
    else:
        col = 'pink'
    color.append(col)

%matplotlib inline
nx.draw(G, with_labels=True, node_color=color, node_size=1000)

enter image description here

0 голосов
/ 03 марта 2019

Вы можете сделать это: (Я изменил свой ответ, если у вас был большой график, чтобы вы не проходили через массу)

import networkx as nx

def keep_neighbors(graph, node):
    tokeep = set()
    for k, v in g[node].items():
        # print v.get('weight') == 1
        if v.get('weight') == 1:
            tokeep.add(k)
    return tokeep

if __name__ == '__main__':
    g = nx.Graph()
    g.add_edge('a', 'b', weight = 1)
    g.add_edge('a', 'c', weight = 1)
    g.add_edge('a', 'd', weight = 2)
    g.add_edge('a', 'e', weight = 1)
    g.add_edge('a', 'f', weight = 1)

    g.add_edge('z', 'c', weight = 1)
    g.add_edge('z', 'd', weight = 1)
    g.add_edge('z', 'e', weight = 1)

    g.add_edge('k', 'c', weight = 1)
    g.add_edge('k', 'd', weight = 1)
    g.add_edge('k', 'e', weight = 1)


    a = keep_neighbors(g, 'a')
    b = keep_neighbors(g, 'z')
    print(a) # set(['c', 'b', 'e', 'f'])
    print(b) # set(['c', 'e', 'd'])

    result = a & b
    print(result) # set(['c', 'e'])

    a = keep_neighbors(g, 'k')
    b = keep_neighbors(g, 'z')
    result = a & b
    print(result) # set(['c', 'e', 'd'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...