繁体   English   中英

从 3D 空间采样 N 个点的有效方法,约束条件是 Python 中两点之间的最小距离

[英]Efficient way to sample N points from a 3D space with the constraint of a minimum distance between two points in Python

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

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)

您的算法可能适用于一小组点,但它不会在确定的时间内运行。

我做了以下操作来创建一个随机森林(模拟树):首先生成一个方形点网格,其中网格点距离是最小距离的 3 倍。 现在,您将规则网格中的每个点都沿随机方向平移,随机距离是最大距离。 结果点永远不会比最大距离更近。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM