最近点の探索(Python)
データセットと目標
2つの点群(A,B)がcsvファイルの形式であります。
Aには直交座標(x,y)の値がメッシュの大きさ2で入っており、各点が固有の値を持っています。つまり、x列、y列、固有の値の列からなるデータです。
BにはAの領域内のランダムな点の座標が格納されています。
これらのデータに対して、Bの各点に最も近い点をAの中から見つけ出し、その固有の値をBの点に付与するという作業をしたいと考えています。
一度コードを書いてみたのですが、処理時間がかかりすぎて困っています。
ご助言いただけると幸いです。
コード
自力で書いたコードは以下の通りです。
(初学者のため読みづらいコードかもしれませんがご容赦ください。)
import pandas as pd
import numpy as np
A = pd.read_csv("ファイルのパス",low_memory=False)
B = pd.read_csv("ファイルのパス")
cols = ['x', 'y', 'elevation','distance']
df = pd.DataFrame(index=[],columns=cols)
###出力用のデータフレームです。elevationが前述の固有の値にあたります。distanceはのちの計算結果を代入するためです。
dammy = pd.DataFrame(index=[],columns=cols)
dammy.loc[0]=999999
###ダミーについては後述します。
for index,row in B.iterrows():
x_B = row['x']
y_B = row['y']
k = A[(A['x']>x_B-1.01)&(A['x']<x_B+1.01)&(A['y']>y_B-1.01)&(A['y']<y_B+1.01)]
###B点を中心とした正方形内部の点に対象を絞ることで処理を軽くしようと考えました
k = k.assign(distance=0)
if len(k)==1:
df = df.append(k)
elif len(k)==0:
df = df.append(dammy)
###正方形内部にAの点がなかった場合、行数合わせのためにダミーを入れています
else:
for index,row in k.iterrows():
x_A=row['x']
y_A=row['y']
dist=np.sqrt((x_B-x_A)**2+(y_B-y_A)**2)
k.at[index,'distance'] = dist
l = k['distance'].idxmin()
m = k.iloc[l:l+1,:]
df = df.append(m)
###正方形内部に複数点ある場合のみ実際距離を計算して小さい方を選択しています。
これで1時間以上かかってしますのですが、処理を速めるいいアイデアはないでしょうか。
よろしくお願いします。