坐标图
Coordinates to graph
有没有比在这些坐标上嵌套循环并为每个坐标添加加权 nodes/edges 更简单、更容易的方法将坐标(经、纬度)转换为“networkx”图?
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 仍需要嵌套循环
你必须做一些循环。但是,如果您使用的是无向图,则可以消除一半的 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})]
有没有比在这些坐标上嵌套循环并为每个坐标添加加权 nodes/edges 更简单、更容易的方法将坐标(经、纬度)转换为“networkx”图?
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 仍需要嵌套循环
你必须做一些循环。但是,如果您使用的是无向图,则可以消除一半的 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})]