【问题标题】:Networkx: how to select all the edges having a given key value?Networkx:如何选择具有给定键值的所有边?
【发布时间】:2020-01-17 22:10:26
【问题描述】:

对于networkx和多重图,如何选择所有具有给定键值的边?

例如,如何使用key==2 选择所有边?

import networkx as nx

G=nx.MultiDiGraph()

G.add_edge(1,2,key=0)
G.add_edge(1,2,key=1)
G.add_edge(1,2,key=2)
G.add_edge(2,3,key=0)
G.add_edge(2,3,key=1)
G.add_edge(2,3,key=2)
G.add_edge(3,4,key=0)
G.add_edge(3,5,key=1)
G.add_edge(3,6,key=2)

#For Example:
#edges with key=2
#(1,2)
#(2,3)
#(3,6)
#Nodes linked to edges with key=2
#1,2,3,6

搜索后,我正在使用 avaris 在主题上提出的解决方案: What is the correct graph data structure to differentiate between nodes with the same name?

但我想可能有更直接的解决方案。

很抱歉没有在我的第一个条目中添加代码示例。

【问题讨论】:

  • 你能添加一些代码来创建一个简单的多重图吗?然后给出一个非常具体的例子来说明你要选择什么?
  • 感谢您的建议。我添加一个简单的例子。
  • 你的应用也是二分图吗?
  • 在我的应用程序中,该图并不完全是二分的。我有两个主要的大图。其中一个是二分的(事实上,如果这个概念存在,它实际上是三分的),但另一个不是。三元图用于补全其他主图的边信息。除了过滤之外,它对我绘制图形非常有用,但由于它是 MultiDiGraph,我应该使用 graphviz。不幸的是,我是 python 新手,我发现安装它非常复杂。所以现在我专注于在图表上完成和排序信息。

标签: python graph networkx


【解决方案1】:

您是否正在寻找这样的东西:

print("All edges with key 2:",
      [(i, j, k)   for i, j, k in G.edges if k == 2])
print("All nodes connected to edges with key 2:",
      set( [n for i, j, k in G.edges if k == 2  for n in [i, j]] ))

输出:

All edges with key 2: [(1, 2, 2), (2, 3, 2), (3, 6, 2)]
All nodes connected to edges with key 2: {1, 2, 3, 6}

【讨论】:

  • 这是您要找的吗?
  • 如果您的图表很大,您可能会重新考虑使用 networkx 图表来表示您的数据。或者用 pandas 数据框之类的东西来表示它,并且只将 networkx 用于特定的图形操作。
  • 感谢您的建议。我开始用表格来模拟我的问题,然后我开始使用集合论和矩阵。最后我发现了非常适合我的问题的图论。我重写了代码,减少了 50%。我想知道是否建议对所有内容都使用图形。根据您的建议,我想图形的使用一定不能广泛。哪个可能是在其中一个或另一个之间进行选择的标准?
  • 我的想法是 networkx 对于不太大的图最有用,尤其是当你想可视化它们时。
猜你喜欢
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
相关资源
最近更新 更多