簡體   English   中英

從networkx中的節點取消引用屬性

[英]dereferencing attributes from nodes in networkx

我正在編寫一個程序,該程序將使用圖表來表示潛在感染的傳播。 為了做到這一點,我將世代屬性分配給我的節點,但是我在取消引用我的“gen”屬性時遇到了麻煩。 我設置的用於比較 level 和 gen 的打印語句(應該等於觸發程序中的下一步)返回:check 1, level is: {1: 0} g is: 0. 我將如何 go 關於取消引用屬性,以便它們只返回一代,我可以將其與我目前正在建模的一代進行比較?

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 -loop一起使用:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM