存储和访问节点属性python networkx

use*_*112 41 python attributes networkx

我有一个使用python创建的节点网络networkx.我想存储在节点的信息,使得我可以访问以后基于节点的标签(节点的名称),并且,其中的信息已被存储(如节点的属性)的字段中的信息.存储的信息可以是一个字符串或数字我希望这样做,以便if xyz是一个节点:

那么我想保存有像的出生日期字符串两个或三个字段xyz dob=1185,出生地点xyz pob=usa和出生的那一天xyz dayob=monday.

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

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

例如,对于if节点xyzabc边缘是否打印了各自的dobs,pobs和dayobs

Mae*_*ler 47

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

G.add_node('abc', dob=1185, pob='usa', dayob='monday')
Run Code Online (Sandbox Code Playgroud)

或者作为字典

G.add_node('abc', {'dob': 1185, 'pob': 'usa', 'dayob': 'monday'})
Run Code Online (Sandbox Code Playgroud)

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

G.node['abc']['dob'] # 1185
G.node['abc']['pob'] # usa
G.node['abc']['dayob'] # monday
Run Code Online (Sandbox Code Playgroud)

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

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.
Run Code Online (Sandbox Code Playgroud)

从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.
Run Code Online (Sandbox Code Playgroud)

  • 类似地,对于边缘,您可以使用`G.edge [u] [v] ['foo']`来访问边缘(u,v)的属性`foo`. (3认同)
  • 如果您想要与给定节点相关的所有属性的列表,是否有一个 `G.node['abc'].all_attributes()` 方法返回所有属性键的列表? (2认同)
  • @kuanb `G.node['abc']` 是一个字典,所以你可以使用常规的字典方法,例如 `G.node['abc'].keys()`。 (2认同)
  • 我刚刚也遇到了这个问题。我要在上面的答案中添加的唯一一件事是确保在字典前面包含“**”,否则它将被解析为多个参数。 (2认同)

Joe*_*oel 25

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

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'
Run Code Online (Sandbox Code Playgroud)

您还可以使用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
Run Code Online (Sandbox Code Playgroud)

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

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

sev*_*ler 6

networkxv2.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}
Run Code Online (Sandbox Code Playgroud)

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

{'abc': 1185}['abc']
> 1185
Run Code Online (Sandbox Code Playgroud)


Mar*_*tin 5

显然现在

G.node[1]['name'] = 'alpha'
Run Code Online (Sandbox Code Playgroud)

不再工作了。

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

在节点处添加 s :

G.nodes[1]['name'] = 'alpha'
Run Code Online (Sandbox Code Playgroud)

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