我将构建一个大型多重图形,它将具有重复边缘的路径。似乎如果我可以按原样遍历每个边缘,我应该能够删除该边缘。
请参阅下面的示例代码。假设我想用path = a和sequence = 3删除边缘。
H.remove_edge(u,v,key = none)意味着使用标记为" key"的单数密钥。 Remove_edge(1,2)将从该列表中选择任意边。
有没有办法在没有添加"键"的情况下删除该边缘每条边的属性?
H = nx.MultiDiGraph()
H.add_edge(1,2,path='a',sequence=1)
H.add_edge(2,1,path='a',sequence=2)
H.add_edge(1,2,path='a',sequence=3)
H.add_edge(1,2,path='b',sequence=1)
print "starting edges:"
for u,v,d in H.edges_iter(data=True):
print str(u)+ " -> " +str(v) + ": "+str(d)
for post in H.out_edges(1,data=True):
if post[2]['path'] == 'a' and post[2]['sequence'] == 3:
H.remove_edge(*post[:2])
print "after single edge removal:"
for u,v,d in H.edges_iter(data=True):
print str(u)+ " -> " +str(v) + ": "+str(d)
由于键是自动内置到图形中的,因此您可以在迭代时通过其键访问边缘:
for post in H.out_edges(1,keys=True,data=True):
if post[3]['path'] == 'a' and post[3]['sequence'] == 3:
H.remove_edge(post[0],post[1],key=post[2])
答案 0 :(得分:0)
查看networkx的源代码:classes/multigraph.py
def remove_edge(self, u, v, key=None):
"""Remove an edge between u and v.
"""
try:
d=self.adj[u][v]
...
# remove the edge with specified data
if key is None:
d.popitem()
else:
try:
del d[key]
except (KeyError):
raise NetworkXError(
"The edge %s-%s with key %s is not in the graph."%(u,v,key))
if len(d)==0:
# remove the key entries if last edge
del self.adj[u][v]
if u!=v: # check for selfloop
del self.adj[v][u]
正如您所看到的,networkx实际上只是del
的优势;如果你不想使用key
键,只需迭代1到2之间的边缘和del
想要摆脱的边缘。
您还可以创建一个add_edge
包装器(或者只是覆盖add_edge
),根据您的key
和{{,如果没有另外指定的话)写path
1}}参数(而不是仅计算最后一个自动密钥ID)。
答案 1 :(得分:0)
以下是使用networkx api删除单个键控边缘的方法:
In [1]: import networkx as nx
In [2]: H = nx.MultiDiGraph()
In [3]: H.add_edge(1,2,path='a',sequence=1)
In [4]: H.add_edge(2,1,path='a',sequence=2)
In [5]: H.add_edge(1,2,path='a',sequence=3)
In [6]: H.add_edge(1,2,path='b',sequence=1)
In [7]: for u,v,key,data in H.out_edges(1,data=True,keys=True):
if data['path']== 'a' and data['sequence']==3:
H.remove_edge(u,v,key=key)
...:
In [8]: H.edges(data=True)
Out[8]:
[(1, 2, {'path': 'a', 'sequence': 1}),
(1, 2, {'path': 'b', 'sequence': 1}),
(2, 1, {'path': 'a', 'sequence': 2})]