1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonで2次元座標系において、指定した座標から最も近い与えられた座表を特定する方法(備忘録)

Last updated at Posted at 2023-02-27

本記事はPython初心者の筆者が備忘録として作成したものである。プログラムの流れとしては、(座標をインストールする関数)→(近傍点を探し出す関数)の2段階としている。

まず2次元座標を考えよう

import pandas as pd
import csv
from matplotlib import pyplot as plt
import math

dict1 = dict(x=[1, 3,3, 6, 9,9,  10],y=[-1, 2,5, 3, 5,0, 9])
df = pd.DataFrame(data=dict1)

fig, ax = plt.subplots(figsize=(2,2))
ax.axis('off')
ax.axis('tight')
ax.table(cellText=df.values,
         colLabels=df.columns,
         loc='center',
         bbox=[0, 0, 1, 1])
plt.savefig('table.png')

このように座標系が出力できましたね。
table.png
ではこの座標系をインストールしていきます。

二次元座標系において座標を与える

def install(): #楕円を構成する座標を読みとる
    points = []
    for i in range(len(df)): #行数分のループを繰り返す
        points.append({"x" : df.iloc[i, 0], "y" : df.iloc[i, 1]})
    return points

これでこの中から次の関数で設定した一番近い値を探索します。

def nearPoint(x, y, points):
    if not points:
        return {}

    closest_point = min(points, key=lambda point: math.sqrt((point["x"] - x) ** 2 + (point["y"] - y) ** 2))
    return {"x": closest_point["x"], "y": closest_point["y"]}

それでは結果を出力してみましょう。

print(nearPoint(3, 3, install()))
print(nearPoint(4, 7, install()))
print(nearPoint(1, 1, install()))
print(nearPoint(7, 8, install()))

結果がこちらになります。
{'x': 3, 'y': 2}
{'x': 3, 'y': 5}
{'x': 1, 'y': -1}
{'x': 10, 'y': 9}

全体のプログラムは以下になります。

import pandas as pd
import csv
from matplotlib import pyplot as plt
import math

dict1 = dict(x=[1, 3, 3, 6, 9, 9, 10],y=[-1, 2, 5, 3, 5, 0, 9])
df = pd.DataFrame(data=dict1)

def install():  # 楕円を構成する座標を読みとる
    points = []
    for i in range(len(df)):  # 行数分のループを繰り返す
        points.append({"x" : df.iloc[i,0], "y" : df.iloc[i,1]})
    return points

def nearPoint(x, y, points):
    if not points:
        return {}

    closest_point = min(points, key=lambda point: math.sqrt((point["x"] - x) ** 2 + (point["y"] - y) ** 2))
    return {"x": closest_point["x"], "y": closest_point["y"]}

追記

コメントにあるようにWolfMoon様にご提示していただいたコードですと、私が示したものよりもかなり計算速度が早いことがわかりました。(2023年03月01日検証)

1
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?