坐标图

时间:2015-02-08 16:03:48

标签: python graph networkx

是否有更简单,更简单的方法将坐标(long,lat)转换为" networkx" -graph,而不是在这些坐标上嵌套循环并为每个坐标添加加权节点/边一个?

for idx1, itm1 in enumerate(data):
    for idx2, itm2 in enumerate(data):
            pos1 = (itm1["lng"], itm1["lat"])
            pos2 = (itm2["lng"], itm2["lat"])
            distance = vincenty(pos1, pos2).meters #geopy distance
            # print(idx1, idx2, distance)
            graph.add_edge(idx1, idx2, weight=distance)

目标将点表示为图形,以便在此图表上使用多个函数。

编辑:使用adjacency_matrix仍然需要一个嵌套循环

1 个答案:

答案 0 :(得分:3)

你必须做某种循环。但是如果你使用的是无向图,你可以消除graph.add_edge()的一半(只需要添加u-v而不是v-u)。另外,正如@EdChum建议你可以使用graph.add_weighted_edges_from()来加快速度。

这是一种很好的方式

In [1]: from itertools import combinations

In [2]: import networkx as nx

In [3]: data = [10,20,30,40]

In [4]: edges = ( (s[0],t[0],s[1]+t[1]) for s,t in combinations(enumerate(data),2))

In [5]: G = nx.Graph()

In [6]: G.add_weighted_edges_from(edges)

In [7]: G.edges(data=True)
Out[7]: 
[(0, 1, {'weight': 30}),
 (0, 2, {'weight': 40}),
 (0, 3, {'weight': 50}),
 (1, 2, {'weight': 50}),
 (1, 3, {'weight': 60}),
 (2, 3, {'weight': 70})]