Python中两点间最小距离约束下从三维空间采样N个点的有效方法

Python中两点间最小距离约束下从三维空间采样N个点的有效方法,python,loops,random,distance,Python,Loops,Random,Distance,我有200个数据点,每个点是一个由3个数字组成的列表,代表位置。我想从这个3D空间中采样N=100个点,但有一个约束,即每两点之间的最小距离必须大于0.15。下面的脚本是我采样点的方式,但它一直在运行,从不停止。此外,如果我将N设置为大于某个值,则代码无法找到所有N个点,因为我随机对每个点进行采样,结果得到一个点,该点与当前点不太接近,但实际上,如果点分布非常“密集”,则N可能远大于该值(但仍满足大于0.15的最小距离)。有更有效的方法吗 import numpy as np import ra

我有200个数据点,每个点是一个由3个数字组成的列表,代表位置。我想从这个3D空间中采样N=100个点,但有一个约束,即每两点之间的最小距离必须大于0.15。下面的脚本是我采样点的方式,但它一直在运行,从不停止。此外,如果我将N设置为大于某个值,则代码无法找到所有N个点,因为我随机对每个点进行采样,结果得到一个点,该点与当前点不太接近,但实际上,如果点分布非常“密集”,则N可能远大于该值(但仍满足大于0.15的最小距离)。有更有效的方法吗

import numpy as np
import random
import time

def get_random_points_not_too_close(points, npoints, min_distance):
    random.shuffle(points)
    final_points = [points[0]]
    while len(final_points) < npoints:
        for point in points:
            if point in final_points:
                continue
            elif min([np.linalg.norm(np.array(p) - np.array(point)) for p in final_points]) > min_distance:
                final_points.append(point)

    return final_points


data = [[random.random() for i in range(3)] for j in range(200)]
t1 = time.time()
sample_points = get_random_points_not_too_close(points=data, npoints=100, min_distance=0.15)
t2 = time.time()
print(t2-t1)
将numpy导入为np
随机输入
导入时间
def获取随机点不太近(点、点、最小距离):
随机。洗牌(点数)
最终分数=[分数[0]]
而len(最终分数)则指出:
对于点到点:
如果最后一个点中的点:
持续
elif最小值([np.linalg.norm(np.array(p)-np.array(point))表示最终_点中的p])>min_距离:
最后的点。附加(点)
返回最终积分
数据=[[random.random()表示范围(3)中的i]表示范围(200)中的j]
t1=时间。时间()
采样点=获取随机点\u不太接近(点=数据,点=100,最小距离=0.15)
t2=时间。时间()
打印(t2-t1)

您的算法可能适用于少量点集,但它不会在确定的时间内运行

我做了以下工作来创建一个随机林(模拟树):首先生成点的方形网格,其中网格点距离是最小距离的3倍。现在,您在常规网格中获取每个点,并以随机距离(最大距离)向随机方向平移。结果点的距离永远不会小于最大距离


这里是包络计算的背面,但是如果你有一个立方空间,N为100,最小密度为0.15,那么假设均匀分布,该空间的边界每边不得大于4.641。如果你的点都存在于一个比这更小的空间中,那么期望找到附近区域是不合理的est Neighbor>0.15。当你增加立方体边的长度时,给定N为100,并测量立方体的范围,你应该能够找到一个更合理的最小距离。我想说,我生成一个随机的3D空间,只是作为一个例子。实际上,我有200个点分布不均匀。相同的计算计算应该适用-是的,您的数据集应该比这个完美分布的人工示例更加集群化,但这仍然应该设置您的期望值。当您将阈值降低到0.15时会发生什么?它完成得更快吗?另一个角度是计算所有最近邻距离,并查看其中的数量满足您的标准-一旦您感到满意,就有很好的成功机会,然后您可以返回到依赖于分离假设的代码。这是否回答了您的问题?