【问题标题】:How to stop Networkx from changing the order of edges when adding them from a list?从列表中添加边时,如何阻止 Networkx 更改边的顺序?
【发布时间】:2017-03-18 13:57:00
【问题描述】:

在 NetworkX (python) 中将列表中的边添加到图形中会更改边的顺序,这会在绘制图形时给我带来问题。 例如:

import networkx as nx

airports = ['A','B','C']
edgelst  = [['C','B'],['A','B'],['A','C']]

G = nx.Graph()

G.add_nodes_from(airports)
G.add_edges_from(edgelst)

如果我检查网络中的现有边缘,结果如下:

>>> G.edges()
[('A', 'C'), ('A', 'B'), ('C', 'B')]

NetworkX 已按字母顺序对边缘进行了排序,但我只是希望它们与 edgelst 的顺序相同。我怎么能做到这一点?

【问题讨论】:

  • 我认为您的问题可能与以下问题有关:stackoverflow.com/questions/17258894/…
  • 确实和那个问题有关,谢谢。我看到不可能做我想做的事,所以我试图找到一种方法来解决它。

标签: python networkx


【解决方案1】:

您的问题的答案有点混乱,因为 NetworkX Graph 类不保留边中节点的顺序。但是,可以通过对每条边进行排序以保证节点顺序来规避这种情况。 G.edges() 也可以通过自定义键进行排序,该键检索每条边出现在边列表中的索引。

import networkx as nx

edgelist  = [['C','B'],['A','B'],['A','C']]

首先,对每条边中的节点进行排序,并创建一个字典,将每条边映射到它在边列表中的索引:

edgelist = [sorted(edge) for edge in edgelist]
mapping = {tuple(edge): index for (edge, index) in zip(edgelist, range(len(edgelist)))}

然后根据边列表中的索引边对图的边进行排序:

G = nx.Graph()
G.add_edges_from(edgelist)
sorted(G.edges(), key=lambda edge: mapping[tuple(sorted(list(edge)))])

【讨论】:

  • 我相信这个答案已经过时了 - 请参阅networkx.github.io/documentation/stable/reference/classes/…
  • @Joel,不,不是。将原帖中的nx.Graph() 替换为nx.ordered.Graph()G.edges() 将为您提供[('A', 'B'), ('A', 'C'), ('B', 'C')]
  • 是的 - 我现在明白了。文档说“节点报告的顺序与节点添加一致,但对于边,顺序不一定是添加边的顺序。”
【解决方案2】:

如果你使用遍历算法,你可以按照它们在路径中被访问的顺序来获取边

```

paths = nx.all_simple_paths(G, source=0, target=3) 对于地图中的路径(nx.utils.pairwise,路径): ...打印(列表(路径)) [(0, 1), (1, 2), (2, 3)] [(0, 1), (1, 3)] [(0, 2), (2, 1), (1, 3)] [(0, 2), (2, 3)] [(0, 3)] ```

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多