我想知道是否有方便的networkx函数,可以返回与给定节点(或节点)(例如my_node_name
)在图形中连接的边的列表(例如G
)。
我可以这样做:
edlist=[]
for ed in G.edges():
if 'my_node_name' in ed:
edlist.append(ed)
但是您希望可能有更好的方法?
我想知道是否有方便的networkx函数,可以返回与给定节点(或节点)(例如my_node_name
)在图形中连接的边的列表(例如G
)。
我可以这样做:
edlist=[]
for ed in G.edges():
if 'my_node_name' in ed:
edlist.append(ed)
但是您希望可能有更好的方法?
如果图是无向的,你可以使用
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)
对于一个无向图,你可以在节点上使用edges
方法:
G.edges(['my_node_name'])
或者函数edges
networkx.edges(G, ['my_node_name'])
但是对于有向图,上面的方法只会给出出边;这时您需要调用并结合in_edges()
和out_edges()
两个函数。
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]
来访问边。