【问题标题】:Storing and Accessing node attributes python networkx存储和访问节点属性 python networkx
【发布时间】:2012-11-21 19:26:43
【问题描述】:

我有一个使用 python networkx 创建的节点网络。我想将信息存储在节点中,以便以后可以根据节点标签(节点名称)和存储信息的字段(如节点属性)访问信息。存储的信息可以是字符串或数字,如果xyz 是一个节点,我希望这样做:

然后我想保存两个或三个字段,其中包含xyzdob=1185 的出生日期、xyzpob=usa 的出生地点和xyz@987654328 的出生日期等字符串@。

我知道我可以使用G.add_node,其中包含属性字典字段...但我似乎无法访问特定字段。如果有其他方法我会很感激的。

然后我想将xyz 与网络中具有相同信息的其他节点进行比较。即节点 xyz 与节点 abc 的交集,基于出生日期、出生地点和出生日期

例如,如果节点 xyzabc 有边缘打印它们各自的 dobs、它们的 pobs 和它们的 dayobs

【问题讨论】:

    标签: python attributes networkx


    【解决方案1】:

    此外,您不必只在添加节点时分配属性。即使添加了之后,您仍然可以直接设置它们。

    import networkx as nx
    G=nx.Graph()
    G.add_edge(1,2)
    #see comment below code for recent versions of networkx.
    G.nodes[1]['name'] = 'alpha'
    G.nodes[2]['name'] = 'omega'
    
    G.nodes[1]['name']
    > 'alpha'
    

    注意:对于 2.4 之前的版本,请使用 G.node[] 而不是 G.nodes[]。见deprecation notes.

    您也可以使用set_node_attributes (documentation),它可以让您同时为多个节点设置一个属性:

    编辑

    #use the next line if it's networkx version 1.x
    #nx.set_node_attributes(G, 'cost', {1:3.5, 2:56})
    
    #use the next line if it's networkx version 2.x
    #nx.set_node_attributes(G, {1:3.5, 2:56}, 'cost')
    
    #or for something that works for 1.x or 2.x
    nx.set_node_attributes(G, values = {1:3.5, 2:56}, name='cost')
    
    G.node[1]['cost']
    > 3.5
    

    可以使用类似的方法来设置边缘属性。

    【讨论】:

    • 请注意,在 networkx 的 2.x 版本中,set_node_attributes() 的第二个和第三个参数的顺序已经切换,因此它将是 nx.set_node_attributes(G, {1:3.5, 2:56}, 'cost')
    【解决方案2】:

    如你所说,添加节点到图的时候添加属性就行了

    G.add_node('abc', dob=1185, pob='usa', dayob='monday')
    

    或作为字典

    G.add_node('abc', {'dob': 1185, 'pob': 'usa', 'dayob': 'monday'})
    

    要访问属性,只需像使用任何字典一样访问它们

    G.node['abc']['dob'] # 1185
    G.node['abc']['pob'] # usa
    G.node['abc']['dayob'] # monday
    

    您说您想查看连接节点的属性。这是一个关于如何实现的小示例。

    for n1, n2 in G.edges_iter():
        print G.node[n1]['dob'], G.node[n2]['dob']
        print G.node[n1]['pob'], G.node[n2]['pob']
        # Etc.
    

    从 networkx 2.0 开始,G.edges_iter() 已被 G.edges() 取代。这也适用于节点。我们设置data=True 来访问属性。现在的代码是:

    for n1, n2 in list(G.edges(data=True)):
        print G.node[n1]['dob'], G.node[n2]['dob']
        print G.node[n1]['pob'], G.node[n2]['pob']
        # Etc.
    

    注意:networkx 2.4 中,G.node[] 已替换为 G.nodes[]

    【讨论】:

    • 对于边也类似,你可以使用G.edge[u][v]['foo']来访问边(u, v)的属性foo
    • 如果你想要一个与给定节点相关的所有属性的列表,是否有一个G.node['abc'].all_attributes() 方法可以返回所有属性键的列表?
    • @kuanb G.node['abc'] 是一个字典,所以你可以使用常规的字典方法,例如G.node['abc'].keys().
    • 我也遇到了这个问题。我要在上面的答案中添加的唯一内容是确保您在字典之前包含**,否则它将被解析为多个参数。
    • 如果一开始就使用“G.add_nodes_from()”,怎么给它们设置属性呢?比如Bi=nx.from_pandas_dataframe(G_df, source=0,target=1) ,如何为源和目标设置不同的属性?
    【解决方案3】:

    现在看来

    G.node[1]['name'] = 'alpha'
    

    不要再工作了。

    我用过这个:https://networkx.github.io/documentation/stable/reference/classes/generated/networkx.Graph.nodes.html

    在节点处添加 s :

    G.nodes[1]['name'] = 'alpha'
    

    【讨论】:

    【解决方案4】:

    networkx v2.0 开始,您可以使用:

    import networkx as nx
    
    G = nx.Graph()
    G.add_node('abc', dob=1185, pob='usa', dayob='monday')
    nx.get_node_attributes(G, 'dob')
    > {'abc': 1185}
    

    您可以像往常一样访问这本词典:

    {'abc': 1185}['abc']
    > 1185
    

    【讨论】:

      猜你喜欢
      • 2012-03-27
      • 2011-04-28
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2013-03-18
      • 2016-04-23
      相关资源
      最近更新 更多