【发布时间】:2012-07-25 15:15:36
【问题描述】:
我从一个 Nx2 唯一点数组开始,然后为这些点找到 Delaunay edges,一个由 points 的索引组成的 Mx2 数组。还有一个Mx1 对应每条边的权重数组。
我正在尝试将数据放入 Hetland 的“Python 算法 - 掌握 Python 语言中的基本算法”一书清单 2.3 中描述的结构中。结构是:
a, b, c, d, e, f, g, h = range(8)
G = [
{b:2, c:1, d:3, e:9, f:4}, # a
{c:4, e:3}, # b
{d:8}, # c
{e:7}, # d
{f:5}, # e
{c:2, g:2, h:2}, # f
{f:1, h:6}, # g
{f:9, g:8} # h
]
其中G[a] 返回与点a 相关的边,G[a][b] 返回在a 和b 之间的边的权重。
转换的目标是能够使用书中也介绍的一些快速遍历等算法。为了在我现有的数据结构和这个结构之间进行转换,我这样做:
def make_graph(points, edges, weights):
G = []
for i in range(len(points)):
w = numpy.where(edges == i)
d = {}
for ind,j in enumerate(edges[w[0],~w[1]]):
d[j] = weights[w[0][ind]]
G.append(d)
return G
这在大型集合上相当耗时(即在 > 15,000 个顶点上需要大约 40 秒)并成为代码中的瓶颈。如何更快地转换成数据结构G?
编辑:
仅供参考,使用matplotlib.delaunay.delaunay() 输出中心、边、三角形和邻居,这可能很有用。但是,我还没有想出如何将它们用于此目的。
【问题讨论】:
标签: python graph dictionary numpy