Атрибут края Networkx - PullRequest
       6

Атрибут края Networkx

0 голосов
/ 19 января 2019

У меня есть такой ориентированный граф-

G = nx.DiGraph()
G.add_edge('a', 'b', attr=0.6)
G.add_edge('a', 'c', attr=0.2)
G.add_edge('d', 'a', attr=0.3)

Как я могу пройти через узел 'a', чтобы получить атрибуты в следующем формате

[0.6, 0.2, -0.3]

Ответы [ 3 ]

0 голосов
/ 19 января 2019

Это должно сделать это, хотя, вероятно, есть лучшие способы:

In [3]: [G[e[0]][e[1]]['attr'] for e in  G.out_edges('a')] + [-G[e[0]][e[1]]['attr'] for e in  G.in_edges('a')]

Out[3]: [0.6, 0.2, -0.3]

Приведенный выше код использует два понимания списка, чтобы зациклить все исходящие и входящие ребра из a и выбирает атрибут из ребер, присваивая отрицательное значение, если оно от входящего ребра.

0 голосов
/ 19 января 2019

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

[G.get_edge_data('a',neigh)['attr'] for neigh in G.successors('a')] + \
[-G.get_edge_data(neigh,'a')['attr'] for neigh in G.predecessors('a')]  
0 голосов
/ 19 января 2019

Ниже приведено одно решение путем итерации по edges.data() графика. П.С .: Я в основном использовал дополнения табуляции в JuPyter, чтобы найти атрибуты, а затем придумал следующее решение, поиграв с различными атрибутами. Этот код даст вам только атрибуты для 'a', как вы и просили. Поэтому, если вы добавите четвертый узел как G.add_edge('d', 'b', attr=0.7), на выходе будет [0.6, 0.2, -0.3], где четвертый узел не считается.

attributes = []

for edge in G.edges.data():
    if edge[0] == 'a':
        attributes.append(edge[-1]['attr'])
    elif edge[1] == 'a'   :
        attributes.append(-edge[-1]['attr'])

print (attributes)    
# [0.6, 0.2, -0.3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...