我正在编写一个程序,该程序将使用图形来表示潜在感染的传播。为了做到这一点,我将世代属性分配给我的节点,然而我在取消引用我的";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)