2016-09-16 49 views
2

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

我当前的代码的想法是:

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

问题,几乎不会需要检查所有的边缘找到最低的任何解决方案。

你可以通过但对整个数据,而不是多次调用使得单呼优化您的来电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,但在此情况下+更好,因为我们知道这些项是列表。

+0

正在运行,出现以下错误: 'TypeError:不支持的操作数类型为+:'InEdgeIterator'和'OutEdgeIterator'' 看起来像方法返回迭代器,而不是列表。 –

+0

@ P-M该文档已被弃用/误导。改为使用'itertools.chain'。答案已更新。 –

+0

现在可以工作,比我最初的方法更优雅。非常感谢你。 –

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) 

这需要重复的进入的边缘也和最小值那么两者之间就必须找到。

相关问题