我对networkx和图表一般都很陌生,希望得到你的帮助。
我正在设计一个图表,其中每个节点都有一个node_id(这只是我为了制作图表而迭代的点数)和五个属性。
即
G.add_node(node_id)
G[id]['Coord1'] = 3
G[id]['Coord2'] = 7
G[id]['Coord3'] = None
G[id]['Coord4'] = None
G[id]['Coord5'] = None
所以现在我想考虑添加一个带有一些坐标的新节点。
现在,在向我的图表中添加新节点之前,我想检查是否已经存在一个具有属性(其中一个坐标)的节点,该节点与我想要添加的节点相同。
如果已存在具有共享的coord的节点,那么我将不会添加新节点,而只是对现有节点进行一些更改。
我能想到这样做的唯一方法是遍历图中的所有现有节点,并检查其中一个属性是否与我正在考虑添加的节点相同。 E.g。
find_node = [attrdict for n,attrdict in G.node.items() if attrdict['coord1'] == tempcoord ]
其中tempcoord是我想要添加的节点上感兴趣的坐标。
每次我想添加节点来检查所有现有节点时,这显然非常低效,我的问题是:有更好的方法吗?
据我所知,networkx不会添加一个具有相同id的新节点,但是它不会扩展到共享相同属性的节点吗?
或者,最好是用所有这些“重复”节点构建图形,然后在添加所有节点后将所有具有某些共享属性的节点压缩到一个节点中?
对于有些复杂的解释感到抱歉,我希望它有一些道理。
答案 0 :(得分:2)
创建一个包含所有观察到的节点属性的集合。如果要添加具有给定属性的节点,请检查该属性是否存在。如果是,则不做任何事情,但如果没有,则添加它并将该属性放入集合中。如果在代码的不同部分完成这些步骤,则可能值得定义一个函数。
seen_attributes = set()
# code here adding nodes
node = node_to_add
attribute = attribute_of_node
if attribute not in seen_attributes:
G.add_node(node, coord=attribute)
seen.add(attribute)