【问题标题】:Querying undirected edge objects in an undirected networkx graph在无向 networkx 图中查询无向边对象
【发布时间】:2018-08-07 01:59:40
【问题描述】:

给定networkx中的一个无向图:

graph=Graph()
graph.add_edge(1,2)
graph.add_edge(2,3)

当使用graph.edges()方法查询该图的边集时,结果以元组的形式返回,即边集的有向视图。在上面的示例中,graph.edges() 返回:

[(1, 2), (2, 3)]

如果我要查询与顶点 2 (graph.edges(2)) 相关的所有边,我会得到不同的定向视图:

[(2, 1), (2, 3)]

例如,如果我有一个将边缘(键)映射到其他对象的外部字典,则此行为是有问题的。例如:

lookup={edge : some_object(edge) for edge in graph.edges()}
for edge in graph.edges(2):
  print(lookup(edge)) #throws key not found exception

抛出异常是因为键 (1,2) 存在,但 (2,1) 不存在。在networkx中迭代无向图时,获取无向对象的最佳(高效/pythonic / ...)方法是什么?我可以将 some_object(edge) 与边缘关联起来作为其属性之一,但这并不能真正回答问题。

【问题讨论】:

  • 如果您使用的是 networkx v2.x,可能值得一看“有序图”:networkx.github.io/documentation/stable/reference/classes/… 这些基本上是图,但似乎可以避免您遇到的问题。另一种方法可能是始终使用sorted(edge),尽管它会返回一个列表,因此您可能需要tuple(sorted(edge))
  • 另一个选项是try.. except

标签: networkx


【解决方案1】:

dfs_labeled_edges(G, source) 使用深度优先搜索遍历图。 由于 dfs_edges 在到达每个节点后停止,它不会总是检测到每条边。相反,可以实现dfs_labeled_edges来获取无向图中的所有边对象。

代码:

import networkx as nx
from networkx import dfs_labeled_edges

nodes = [1,2,3]
edges = [(1,2), (2,3)]
G = nx.Graph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)

undirectedGraphEdges = []

dfs = list(dfs_labeled_edges(G,1))

for edge in dfs:
    if(edge[:2] not in undirectedGraphEdges):
    undirectedGraphEdges.append(edge[:2])

if undirectedGraphEdges[0] not in edges:
    del undirectedGraphEdges[0]


print(undirectedGraphEdges)

# [(1, 2), (2, 1), (2, 3), (3, 2)]

【讨论】:

    猜你喜欢
    • 2019-08-25
    • 2019-04-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    相关资源
    最近更新 更多