首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python图表-工具访问折点属性

python图表-工具访问折点属性
EN

Stack Overflow用户
提问于 2017-03-14 21:32:57
回答 1查看 3.8K关注 0票数 3

对于我当前的项目,我想使用图形工具库,因为它们声称是最快的:https://graph-tool.skewed.de/performance。我有一些算法(最短路径等)在非常大的网络上运行,所以越快越好!

第一个问题:这个说法是“最快的”吗?;)

当我试图构建一个适合我需要的图形工具图形时,我发现不可能以一种有效的方式访问顶点属性。也许我错过了什么?

我的问题是,函数"getVertexFromGraph(graph,position)“是否可以以更有效的方式编写?或者更一般地说:我是否可以有效地检查顶点(由其位置属性给定)是否已经在图形中。

提前感谢!

代码语言:javascript
复制
import graph_tool as gt
#from graph_tool.all import *

edgeList = [[(0.5,1),(2.1,4.3)],[(2.1,4.3),(5.4,3.3)],[(5.4,3.3),(1.3,3.5)],[(4.4,3.3),(2.3,3.5)]] #A lot more coordinate values....

# Initialize the graph
routableNetwork = gt.Graph()

# Initialize the vertex property "position" to store the vertex coordinates
vpPosition = routableNetwork.new_vertex_property("vector<double>")
routableNetwork.vertex_properties["position"] = vpPosition

def getVertexFromGraph(graph, position):
    """
    This method checks if a vertex, identified by its position, is in the given graph or not.
    :param graph:       The graph containing all vertices to check  
    :param position:    The vertex/position to check
    :return:            The ID of the vertex if the vertex is already in the graph, 'None' otherwise
    """
    for v in graph.vertices():
        if graph.vp.position[v] == position:
            return v
    return None

def main():
    """
    This method creates the graph by looping over all given edges, inserting every: 
        - non existent vertex in the graph with its coordinates (property 'position')  
        - edge with its corresponding length (property 'distance')
    :return: -
    """
    for e in edgeList:
        vertex0 = getVertexFromGraph(routableNetwork,e[0])
        vertex1 = getVertexFromGraph(routableNetwork,e[1])
        if vertex0 == None:
            vertex0 = routableNetwork.add_vertex()
            routableNetwork.vertex_properties['position'][vertex0] = e[0]
        if vertex1 == None:
            vertex1 = routableNetwork.add_vertex()
            routableNetwork.vertex_properties['position'][vertex1] = e[1]

        edge = routableNetwork.add_edge(vertex0,vertex1)
        #routableNetwork.edge_properties['distance'][edge] = calculateDistance(e[0][0],e[0][1],e[1][0],e[1][1])

    #saveRoutableNetwork(routableNetwork)
    #graph_draw(routableNetwork, vertex_text=routableNetwork.vertex_index, vertex_font_size=18, output_size=(200, 200), output="two-nodes.png")

if __name__ == "__main__":
    main()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-15 19:37:49

您要查找的函数是find_vertex()

https://graph-tool.skewed.de/static/doc/util.html#graph_tool.util.find_vertex

重要的是要认识到,graph-tool是通过将性能敏感的循环从Python卸载到C++来实现其速度的。因此,当你迭代顶点时,就像你在代码中做的那样,你失去了任何优势。

还要注意的是,尽管find_vertex()是用C++实现的,因此比纯Python语言中的等价物快很多倍,但它仍然是O(N)操作。对于大型图,最好创建一个很好的旧python字典,它将属性值映射到顶点,这具有O(1)的查找成本。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42787443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档