存储和访问节点属性 Python NetworkX

92

我用python的networkx创建了一个节点网络。我想要将信息存储在节点中,以便我可以基于节点标签(节点名称)和存储信息的字段(如节点属性)稍后访问该信息。存储的信息可以是字符串或数字。我希望以这样的方式进行操作,即如果xyz是一个节点:

那么我想要保存两个或三个具有字符串的字段,如xyz的出生日期dob=1185xyz的出生地pob=usaxyz的出生日dayob=monday

我知道我可以使用G.add_node的属性字典字段...但是我似乎无法针对特定的字段进行访问。如果有其他方法,我会非常感激。

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

例如,如果节点xyzabc之间有一条边,则打印它们各自的dob,它们的pob和它们的dayob

5个回答

95

就像你所说的那样,只需要在将节点添加到图形中时添加属性即可。

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[]


8
同样地,对于边,您可以使用G.edge[u][v]['foo']来访问边(u, v)的属性foo - Agostino
2
如果您想要一个与给定节点相关的所有属性列表,是否有一个G.node['abc'].all_attributes()方法返回所有属性键的列表? - kuanb
2
@kuanb G.node['abc'] 是一个字典,因此您可以使用常规的字典方法,例如 G.node['abc'].keys() - Maehler
2
我也遇到了这个问题。除了上面的答案,我要补充的是要确保在字典前加上 **,否则它将被解析为多个参数。 - greenbergé
1
如果你在开始时使用“G.add_nodes_from()”,那么你如何为它们设置属性呢?例如,Bi=nx.from_pandas_dataframe(G_df, source=0,target=1),如何为源和目标设置不同的属性? - Sos

55
此外,您不必仅在添加节点时分配属性。即使在添加后,您仍然可以直接设置它们。
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[]。请参见弃用说明。 您还可以使用set_node_attributes(文档),它将让您同时为多个节点设置属性。 编辑
#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

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

4
请注意,在networkx 2.x版本中,set_node_attributes()函数的第二个和第三个参数的顺序已经调换,所以应该这样写:nx.set_node_attributes(G, {1:3.5, 2:56}, 'cost') - Max Candocia

8

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

5

3
注意:对于2.4版本之前的版本,请使用G.node[]而不是G.nodes[]。请参阅弃用说明(https://networkx.github.io/documentation/stable/release/release_2.4.html#deprecations)。 - Ben

0

要将属性添加为字典,您可以执行以下操作

g.add_node('node_id', **{"attr1": "val1", "attr2": "val2"})

小提示:如果你不添加**,就会出现异常:TypeError: add_node() takes 2 positional arguments but 3 were given


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接