在NetworkX(python)中迭代(重新)命名节点和边缘属性

时间:2018-02-16 19:23:57

标签: python iteration networkx

关于添加一个节点/边缘/属性的单行,有很多关于此的信息,但我正在寻找允许我使用属性分配100个节点(以及最终边缘)的循环等

例如,有图G,包含100个节点

我想给每个节点一个值,但这不起作用:

G = nx.Graph()
G.add_nodes_from(range(1,101))

G_node_atts = range(0,100)
G_na = nx.path_graph(G_node_atts)
G.add_edges_from(G_na.edges())

导致:

G.nodes(data=True)
NodeDataView({0: {}, 1: {}, 2: {}, 3: {}, 4: {}, 5: {}, 
... etc.

G.edges(data=True)
EdgeDataView([(0, 1, {}), (1, 2, {}), (2, 3, {}), (3, 4, {}),
... etc.

我希望节点属性看起来像:

[(1, {'id':0}),(2, {'id':1}), etc.]

非常感谢任何帮助。

编辑:答案非常有用,并返回所需的结果。 但是,如果我有几个节点类型,请说节点A,B和C,我希望它们都包含0到3之间的属性值。

 ( {1: {'A': 0}, 2: {'A': 1}, 3: {'A': 2}, 4: {'A': 3} )
 ( {5: {'B': 0}, 6: {'B': 1}, 7: {'B': 2}, 8: {'B': 3} )
 ( {9: {'C': 0}, 10: {'C': 1}, 11: {'C': 2}, 12: {'C': 3} )

我是否需要某种嵌套for循环?

(我的总体目标是拥有一个有点大的图形(可能是400.000个节点),它可以包含几种类型的节点(比如20),这些节点通过函数可以在它们之间生成边缘(以及属性,边缘权重等)。 )。)

1 个答案:

答案 0 :(得分:0)

您可以尝试以下操作:

G = nx.Graph()

for attr in range(100):
    G.add_node(attr+1, id=attr)

[编辑] 您可以构建一个类似node_types = {1: 'A', 2: 'A', 3: 'A', ...}的目录,其中每个节点都有其类型,然后:

G = nx.Graph()

for attr in range(100):
    node = attr + 1
    G.add_node(node, node_type={node_types[node]: attr%4})