質問
私のプログラムは、頂点のネットワークを tkinter キャンバス上で接続してレンダリングできるようにするいくつかのデータ セットを生成します。ネットワーク内の各頂点の N 番目の隣接点を見つけることができる必要があります。
私のコードは、各頂点とそのすぐ隣の頂点との接続を既に識別しています。つまり、選択した頂点をデータを検索する値として使用するリスト内包表記を使用して、最初の一連の頂点を簡単に見つけることができます。隣人ごとにこの検索を効果的に繰り返したいのですが、最も効率的な方法です。これを達成するために検索されているデータ (私は既に計算しています) はp_2
、以下のコードのように指定され、次の形式です: (Origin Coordinate, Neighbor Coordinate), andCoordinates_xyz
ネットワークの一意の頂点のリストです。以下のコードは、私が現在どのように最初の隣人のみを識別しているかを示しています。
繰り返しますが、私はすでにすべての隣接データを持っています。このデータを検索して各頂点への接続を見つけるための最良の方法が必要なだけです。
明快さ:
私がやろうとしていることの例:
私のプログラムが生成するデータの 1 つのタイプは、繰り返される正方形パターンの頂点のネットワークを表します。各頂点 (エッジから離れている) には 4 つの隣接点があり、各隣接点には 4 つの隣接点があります (ただし、これらの隣接点の 1 つの隣接点は前の頂点であるため、割り引かれます)。座標で頂点 20 を選択(x20, y20, z20)
し、p_2 で近隣を検索すると、(たとえば)
(Origin)、(Neighbour)が返される場合があります。
(x20, y20, z20), (x21, y21, z21)
(x23, y23, z23), (x20, y20, z20)
(x26, y26, z23), (x20, y20, z20)
(x20, y20, z20), (x30, y30, z30)
次に、頂点 21、23、26、および 30 が頂点 20 のネットワーク内の隣接点であることを明確に確認できます。ただし、2 番目に近い隣接点を見つけるには、それぞれ 21、23、26、および 30 の検索プロセスを繰り返す必要があります。次に、N 個の最近傍について、近隣の順序を追跡しながら頂点 20 から外側に進み、すべての近隣についてこの検索を繰り返すための効率的な (可能な限り) 方法を作成する方法を見つけなければなりません。繰り返しますが、これが大きな N に対して負担になることは承知していますが、通常は N>4 では動作しません。以下のコードは、N = 1 の場合の問題を解決します。
matching_1_NN_list=[]
matching_1_NN_list[:]=[]
for vertex in xrange(len(Coordinates_xyz)):
#Target vertex Coordinates_xyz[vertex]
matching_1_NN = [x for x in p_2 if Coordinates_xyz[vertex] in x]
matching_1_NN_Component_0=column(matching_1_NN, 0)
matching_1_NN_Component_1=column(matching_1_NN, 1)
for x in matching_1_NN_Component_0:
if x == Coordinates_xyz_final[vertex]:
pass
else:
x=x, vertex, 1 #coordinates, vertex number, order (1 = first neighbour)
matching_1_NN_list.append(x)
for x in matching_1_NN_Component_1:
if x == Coordinates_xyz_final[vertex]:
pass
else:
x=x, vertex, 1
matching_1_NN_list.append(x)
matching_1_NN_list=set(list(matching_1_NN_list)) #Removes Duplicates