存储和访问节点属性python networkx

时间:2012-12-04 07:56:11

标签: python attributes networkx

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

然后我要保存两个或三个字段,其中包含xyz dob=1185的出生日期,xyz pob=usa的出生日期以及当天的字符串xyz dayob=monday的出生。

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

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

例如,对于节点xyzabc是否有边缘打印各自的dob s,他们的pob s及其dayob s

4 个答案:

答案 0 :(得分:40)

正如您所说,只需在向图表添加节点时添加属性

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.

答案 1 :(得分:22)

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

import networkx as nx
G=nx.Graph()
G.add_edge(1,2)
G.node[1]['name'] = 'alpha'
G.node[2]['name'] = 'omega'

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

您还可以使用set_node_attributesdocumentation),这样您就可以同时为多个节点设置属性:

nx.set_node_attributes(G, 'cost', {1:3.5, 2:56})
G.node[1]['cost']
> 3.5

类似的方法可用于设置边缘属性。

答案 2 :(得分:6)

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

答案 3 :(得分:0)

显然是现在

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

不再工作。

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

在节点上添加s:

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