存储和访问节点属性 python networkx

Posted

技术标签:

【中文标题】存储和访问节点属性 python networkx【英文标题】:Storing and Accessing node attributes 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

【问题讨论】:

【参考方案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'

【讨论】:

注意:对于 2.4 之前的版本,使用 G.node[] 而不是 G.nodes[]。请参阅弃用说明 (networkx.github.io/documentation/stable/release/…)【参考方案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

【讨论】:

以上是关于存储和访问节点属性 python networkx的主要内容,如果未能解决你的问题,请参考以下文章

创建一个网络,其中节点使用 networkx 存储多个属性数据

是否可以使用 Networkx 和 Python 根据节点属性获取度中心性值?

Networkx:通过循环遍历节点列表添加属性时,IndexError:列表索引超出范围

python networkx 在某些条件下删除节点和边

如何根据注释属性对networkx python图中的节点进行分组?

NetworkX 中的节点与边