75

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

然后我想保存两个或三个具有字符串的字段,例如出生日期、出生xyz dob=1185地点和出生xyz pob=usa日期xyz dayob=monday

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

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

例如对于 if 节点xyz并且abc有一个边缘打印它们各自dob的 s、它们pob的 s 和它们dayob的 s

4

5 回答 5

79

正如您所说,只需在将节点添加到图中时添加属性即可

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

于 2012-12-04T12:19:32.767 回答
46

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

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

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

于 2015-04-30T03:16:56.530 回答
8

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}

你可以像往常一样访问这个字典:

{'abc': 1185}['abc']
> 1185
于 2018-02-26T08:30:39.370 回答
4

显然现在

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

不再工作。

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

在节点添加 s :

G.nodes[1]['name'] = 'alpha'
于 2019-12-25T22:06:24.373 回答
0

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

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

ps如果你不添加**你会得到异常: TypeError: add_node() takes 2 positional arguments but 3 were given

于 2021-12-28T05:43:45.760 回答