一意のポイントの配列から始めて、それらのポイントNx2
のDelaunayを見つけます。これは、へのインデックスで構成される配列です。各エッジに対応する重みの配列もあります。edges
Mx2
points
Mx1
Hetlandの著書「PythonAlgorithms-MasteringBasicAlgorithms inthePythonLanguage」のリスト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()
出力の中心、エッジ、三角形、および隣接するものを使用します。これは便利な場合があります。しかし、私はこの目的のためにそれらをどのように使用するかを理解していません。