获取与给定节点相连的所有边在networkx图中。

69

我想知道是否有方便的networkx函数,可以返回与给定节点(或节点)(例如my_node_name)在图形中连接的边的列表(例如G)。

我可以这样做:

edlist=[]
for ed in G.edges():
     if 'my_node_name' in ed:
            edlist.append(ed)

但是您希望可能有更好的方法?

3个回答

111

如果图是无向的,你可以使用

G.edges(node)

在networkx 2.x中,这是一个EdgeDataView对象。在networkx 1.x中,这是一个列表——如果你想要1.x中的生成器而不是获取整个列表,则G.edges_iter(node)可行(在2.x中已不再使用)。

如果图是有向的,则上述命令将不会给出入边。使用

G.in_edges(node)
G.out_edges(node) 

这些是2.x中的视图。在1.x中,它们是列表,并有生成器选项:G.in_edges_iter(node)G.out_edges_iter(node)


18

对于一个无向图,你可以在节点上使用edges方法:

G.edges(['my_node_name'])

或者函数edges

networkx.edges(G, ['my_node_name'])

但是对于有向图,上面的方法只会给出出边;这时您需要调用并结合in_edges()out_edges()两个函数。


12
警告 - 如果图是有向的,这将仅提供出边。 - Joel

1
对于有向多重图,我发现以下解决方法来处理出边:
import networkx as nx

a = nx.MultiDiGraph()
a.add_edge("a", "b", 0)
a.add_edge("a", "b", 1)
a.add_edge("b", "c", 0)
a.add_edge("b", "c", 1)

# This is too much:
print(a.edges)
# OutMultiEdgeView([('a', 'b', 0), ('a', 'b', 1), ('b', 'c', 0), ('b', 'c', 1)])

# This is insufficient:
print(a.in_edges("b"))
# InMultiEdgeDataView([('a', 'b'), ('a', 'b')])

# This is just right
print(a["a"])
# AdjacencyView({'b': {0: {}, 1: {}}})
print(a["a"]["b"])
# AtlasView({0: {}, 1: {}})

对于入边,您应该首先使用a.in_edges(node),然后使用a[source][node]来获取边的类型。

一旦您获得了所有三元组t = (source, sink, type),您可以通过调用a.edges[t]来访问边。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接