找到连接到给定节点的所有边的边缘属性的最小值

时间:2016-09-16 12:02:07

标签: python graph-tool

我有一个网络,每个边都标有日期。我现在还要标记我的顶点,以便每个顶点都有一个分配给它的日期,对应于所有边缘事件的最小日期和从它发出的边缘。是否有一个内置函数来找到这个比我循环遍历所有顶点然后手动每个顶点的所有边缘更快?换句话说:我在一个函数之后找到给定边缘子集的给定边缘属性的最小值。

我目前的代码理念是:

lowest_year = 2016
for v in g.vertices():
    for e in v.in_edges():
        year = g.ep.year[e]
        lowest_year = min(year,lowest_year)
    for e in v.out_edges():
        year = g.ep.year[e]
        lowest_year = min(year,lowest_year)
    g.vp.year[v]=lowest_year
    lowest_year = 2016

2 个答案:

答案 0 :(得分:2)

几乎没有任何解决方案不需要检查所有边缘以找到最小值。

然而,您可以通过对整个数据进行一次调用而不是多次调用来优化对min的通话,而且您也不再需要lowest_year

from itertools import chain

for v in g.vertices():
    g.vp.year[v] = min(map(g.ep.year.__getitem__, chain(v.in_edges(), v.out_edges())))

方法in_edgesout_edges都会返回您可以轻松与+运算符合并的列表。

在更一般的情况下,当您忘记要合并的类型时,可以使用itertools.chain,但在这种情况下+更好,因为我们知道这些项是列表。

答案 1 :(得分:0)

此讨论(http://main-discussion-list-for-the-graph-tool-project.982480.n3.nabble.com/Find-minimum-value-of-edge-property-for-all-edges-connected-to-a-given-node-td4026722.html)也包含针对此主题的一些有用建议。它还强调了图形工具中实际上有一种内置方法,用于在所有传出边缘(https://graph-tool.skewed.de/static/doc/graph_tool.html#graph_tool.incident_edges_op)中找到最低值:

g.vp.year = incident_edges_op(g, "out", "min", g.ep.year)

这也需要重复进入边缘,然后必须找到两者之间的最小值。