python - 在 igraph [python] 中将两个有向边折叠成一个

标签 python igraph

我有一个有向图,在许多情况下,两个节点之间的边有两个方向,具有不同的权重。例如,权重为 3 的 a-->b 和权重为 1 的 b-->a。我想将这些组合成一个只存在总权重的图表,即这个例子会产生一个图表,其中 a-->权重为 2。

我见过 g.simplify(),但我如何让它合并相对的边?

最佳答案

假设在相同的两个顶点之间可以有多个相同方向的边,如果是这样的话你想把它们的权重加起来,你可以从

开始
g.simplify(combine_edges='sum')

然后对于每一对顶点ab,最多有一条边从ab .

要将这些相对的边合并为一条边,可以使用实例方法 to_undirected , 它转换 g到一个无向图。第一步之后,每对顶点之间最多应该有两条边,总是相对的。所以如果你想从另一个方向减去一个方向的重量,你可以这样做:

def subwt(attrs):
     if len(attrs) == 1:
         return attrs[0]
     assert len(attrs) == 2
     return attrs[0] - attrs[1]

g.to_undirected(combine_edges=subwt)

但这给了你一个无向图,以及边的权重应该取为从ab,还是从ba,无法分辨。

如果你想要一个有向图,你如何选择从 ab 的权重为 2 的边,还是从 b 到权重为 -2 的 a

这里有一个函数可以生成这样的有向图;输出图中每条边的方向由输入图中顶点之间遇到的第一条边决定。此外,从第一条边复制除“权重”之外的任何边属性,忽略任何其他边。

def combine_edges(graph):
    combe = graph.copy() # copies graph attributes, vertex attributes
    combe.delete_edges(None) # removes all edges
    for e in graph.es:
        src, targ = e.tuple
        if combe.are_connected(src, targ):
            ced = combe.es(_source=src, _target=targ)[0]
            ced['weight'] += e['weight']
        elif combe.are_connected(targ, src):
            ced = combe.es(_source=targ, _target=src)[0]
            ced['weight'] -= e['weight']
        else:
            combe.add_edge(src, targ, **e.attributes())
    return combe

关于python - 在 igraph [python] 中将两个有向边折叠成一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41252952/

相关文章:

python - 访问列表元素并调用它们的函数

python 分割和反转文本文件

r - 允许R igraph中的箭头大小与边缘宽度匹配的技巧

r - r中的时变网络

r - 将权重矩阵应用于现有图表

python - 如何仅将数字的第一部分保留在数据框中的列中?

python - Visual Studio Code 不会使用池映射将调试器附加到 python 中的多进程

r - 如何在 igraph 中对社区集群内的边缘进行着色

python - 两个节点之间的路径

python - 2. 类级别的 django Manager?