正在取消引用networkx中节点的属性



我正在编写一个程序,该程序将使用图形来表示潜在感染的传播。为了做到这一点,我将世代属性分配给我的节点,然而我在取消引用我的";gen";属性我设置的用于比较level和gen的print语句(应该等于触发程序中的下一步(返回如下:check 1,level is:{1:0}g is:0。我该如何取消引用属性,使它们只返回生成,并将其与我目前正在建模的生成进行比较?

for node in G.nodes(): #check through nodes and find the ones in the current gen
level = nx.get_node_attributes(G, "gen") #get the gen
print("check 1, level is:", level, "g is:", g)
if level == g: 
print("check 2")
y = scipy.stats.poisson.rvs(mu=r, size=1) #see how many are infected
N[count] = N[count] + y #how many infected

这就是我当前分配属性的方式,标记它是数字节点,然后根据计数器为其分配一代

G.add_node(1, gen = count)

nx.get_node_attributes(G, "gen")为字典{node:gen, ...}提供了所有具有gen的节点(以及跳过没有gen的节点(,您可以直接将其与for一起使用-循环:

for node in nx.get_node_attributes(G, "gen"):
gen = G.nodes[node]['gen']
print('node:', node, 'gen:', gen)
if gen == g: 
print("check 2")

使用.items()(因为它是字典(

for node, gen in nx.get_node_attributes(G, "gen").items():
print('node:', node, 'gen:', gen)
if gen == g: 
print("check 2")

您也可以使用G.nodes.data()来获得具有所有节点的字典{node:attributes, ...}

for node, attribs in G.nodes.data():
#gen = attribs['gen']    # it raises error when node doesn't have `gen`
gen = attribs.get('gen')  # it gives `None` when node doesn't have `gen` 

最小工作代码(一个节点没有gen(

import networkx as nx
G = nx.Graph()
g = 0
G.add_node(1, gen=g)
G.add_node(2, gen=1)
G.add_node(3)             # without gen
G.add_node(4, gen=g)
for node, gen in nx.get_node_attributes(G, "gen").items():
#gen = G.nodes[node]['gen']
print('node:', node, 'gen:', gen)
if gen == g:
print("> check 2")
print('---')
for node, attribs in G.nodes.data():
#gen = attribs['gen']    # it raises error when node doesn't have `gen`
gen = attribs.get('gen')  # it gives `None` when node doesn't have `gen` 
print('node:', node, 'attribs:', attribs, 'gen:', gen)
if gen == g: 
print("> check 2")

结果:

node: 1 gen: 0
> check 2
node: 2 gen: 1
node: 4 gen: 0
> check 2
---
node: 1 attribs: {'gen': 0} gen: 0
> check 2
node: 2 attribs: {'gen': 1} gen: 1
node: 3 attribs: {} gen: None
node: 4 attribs: {'gen': 0} gen: 0
> check 2

编辑:

在源代码中,我发现了的例子

https://github.com/networkx/networkx/blob/main/networkx/classes/graph.py#L752

for node, attribs in G.nodes(data=True):
print('node:', node, 'attribs:', attribs, 'gen:', attribs.get('gen'))
for node, gen in G.nodes(data="gen"):
print('node:', node, 'gen:', gen)
for node, gen in G.nodes("gen"):
print('node:', node, 'gen:', gen)

最新更新