存储和访问节点属性 python networkx
Posted
技术标签:
【中文标题】存储和访问节点属性 python networkx【英文标题】:Storing and Accessing node attributes python networkx 【发布时间】:2012-11-21 19:26:43 【问题描述】:我有一个使用 python networkx
创建的节点网络。我想将信息存储在节点中,以便以后可以根据节点标签(节点名称)和存储信息的字段(如节点属性)访问信息。存储的信息可以是字符串或数字,如果xyz
是一个节点,我希望这样做:
然后我想保存两个或三个字段,其中包含xyz
dob=1185
的出生日期、xyz
pob=usa
的出生地点和xyz
@987654328 的出生日期等字符串@。
我知道我可以使用G.add_node
,其中包含属性字典字段...但我似乎无法访问特定字段。如果有其他方法我会很感激的。
然后我想将xyz
与网络中具有相同信息的其他节点进行比较。即节点 xyz
与节点 abc
的交集,基于出生日期、出生地点和出生日期
例如,如果节点 xyz
和 abc
有边缘打印它们各自的 dob
s、它们的 pob
s 和它们的 dayob
s
【问题讨论】:
【参考方案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:列表索引超出范围