如何从NetworkX中的多维图形中删除具有属性的边?

时间:2015-02-10 17:48:13

标签: python networkx graph-theory

我将构建一个大型多重图形,它将具有重复边缘的路径。似乎如果我可以按原样遍历每个边缘,我应该能够删除该边缘。

请参阅下面的示例代码。假设我想用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)
  • 输出:
    • 起始边缘:
    • 1 - > 2:{'路径':' a','序列':1}
    • 1 - > 2:{'路径':' a','序列':3}
    • 1 - > 2:{'路径':'','序列':1}
    • 2 - > 1:{'路径':' a','序列':2}
    • 单边移除后:
    • 1 - > 2:{'路径':' a','序列':3}
    • 1 - > 2:{'路径':'','序列':1}
    • 2 - > 1:{'路径':' a','序列':2}

由于键是自动内置到图形中的,因此您可以在迭代时通过其键访问边缘:

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])

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})]