Каков наиболее эффективный способ перемещения / переименования узла в NetworkX? - PullRequest
14 голосов
/ 16 марта 2011

Я использую библиотеку графов NetworkX для Python. В какой-то момент в моей программе я хотел бы «объединить» мои ID узлов в последовательность чисел. Вот мой наивный подход:

start = 1 # could be anything
for i, n in enumerate(g.nodes()):
    if i+start == n:
        continue
    g.add_node(i+start, attr_dict=g.node[n])
    g.add_edges_from([(i+start, v, g[n][v]) for v in g.neighbors(n)])
    g.remove_node(n)

Есть ли более быстрый способ, чем эта исчерпывающая копия всех соседей? Например, я пробовал g[i+start] = g[n], но это запрещено.

Спасибо!

Ответы [ 2 ]

9 голосов
/ 16 марта 2011

Будет ли это работать?

http://networkx.github.io/documentation/latest/reference/generated/networkx.relabel.convert_node_labels_to_integers.html

import networkx as nx
G = nx.Graph()
G.add_node(1)
G.add_nodes_from('spam')
print G.nodes()

возвращается:

['a', 1, 's', 'm', 'p']

сейчас:

start = 1
G = nx.convert_node_labels_to_integers(G,first_label=start)
print G.nodes()

возвращается:

[1, 2, 3, 4, 5]
8 голосов
/ 28 января 2015

Если ваш интерес все еще актуален, есть networkx.relabel_nodes(), который использует словарь сопоставления.

...