python - 如何加快搜索算法
问题描述
我有两个不同的目录(data_in
和data_out
),其中x,y
有许多点的坐标。如下所示,我需要找到所有data_in
点附近的data_out
点,特别data_in
是半径圆内的所有点r_search
,以每个data_out
点为中心。
这个小脚本运行良好,但速度很慢。有没有办法加快进程?
import numpy as np
data_in = np.genfromtxt(file_in)
x_in = np.array(data_in[:,1])
y_in = np.array(data_in[:,2])
data_out = np.genfromtxt(file_out)
x_out = np.array(data_out[:,1])
y_out = np.array(data_out[:,2])
r_search = 5
a=0
for i in range(len(x_out)):
for j in range(len(x_in)):
delta_x = abs(x_in[j] - x_out[i])
delta_y = abs(y_in[j] - y_out[i])
r_tmp = np.sqrt(np.power(delta_x,2) + np.power(delta_y,2))
if (r_tmp <= r_search):
a=a+1
X = np.zeros(a)
Y = np.zeros(a)
a=0
for i in range(len(x_out)):
for j in range(len(x_in)):
delta_x = abs(x_in[j] - x_out[i])
delta_y = abs(y_in[j] - y_out[i])
r_tmp = np.sqrt(np.power(delta_x,2) + np.power(delta_y,2))
if (r_tmp <= r_search):
X[a] = x_in[j]
Y[a] = y_in[j]
a=a+1
解决方案
一种可能的优化是从距离计算中删除(昂贵的)平方根并与平方搜索半径进行比较,因此:
r_tmp = np.sqrt(np.power(delta_x,2) + np.power(delta_y,2))
if (r_tmp <= r_search):
变成:
r_tmp = np.power(delta_x,2) + np.power(delta_y,2)
if (r_tmp <= r_search*r_search):
推荐阅读
- reactjs - 使用 React 的 Jest-Puppeteer 测试不会在输入中输入文本
- javascript - 是否可以在 ASP.NET MVC 的局部视图上使用一些 JavaScript?
- python - 是否可以暂停递归蜘蛛,直到所有线程都完成?
- javascript - 移动 iOS 设备(移动 Chrome 和 Safari)上的 mp3 音频缓存问题
- angular - 当表单在其ng-content中时如何禁用/启用父组件中的提交按钮
- java - 应用程序启动时的中央一次性初始化
- sql - 如何在日期索引后 5 天包含所有记录
- python - 连接具有分类特征的数据帧时的无序索引
- mysql - 如何在新行上创建触发器 mysql?
- c# - 使用 UnityEngine.JsonUtility 从 Unity3d 中的 InfluxDB REST 反序列化 JSON