Python:确保每个成对距离> =某个最小距离

我有一个约200,000个点的2D阵列,并且希望“抖动”这些点,使得任何点与其最近邻居之间的距离是> =某个最小值.

在从头开始编写此算法之前,我想问:是否有任何规范方法或经常使用的算法来实现此行为?我认为在开始之前先审查这些算法是有意义的.

任何其他人可以提出的关于这个问题的建议将不胜感激.

最佳答案 我最终使用了一种名为
“Lloyd iteration”的技术来解决这个问题.算法背后的想法非常简单;在一组点上运行Lloyd迭代,我们:

>构建点的Voronoi图
>将Voronoi单元中的每个点居中
>重复,直到点充分分离

This gist有一些示例代码(带可视化):

from lloyd import Field
from scipy.spatial import voronoi_plot_2d
import matplotlib.pyplot as plt
import numpy as np
import umap, os

def plot(vor, name, e=0.3):
  '''Plot the Voronoi map of 2D numpy array X'''
  plot = voronoi_plot_2d(vor, show_vertices=False, line_colors='y', line_alpha=0.5, point_size=5)
  plot.set_figheight(14)
  plot.set_figwidth(20)
  plt.axis([field.bb[0]-e, field.bb[1]+e, field.bb[2]-e, field.bb[3]+e])
  if not os.path.exists('plots'): os.makedirs('plots')
  if len(str(name)) < 2: name = '0' + str(name)
  plot.savefig( 'plots/' + str(name) + '.png' )

# get 1000 observations in two dimensions and plot their Voronoi map
np.random.seed(1144392507)
X = np.random.rand(1000, 4)
X = umap.UMAP().fit_transform(X)

# run 20 iterations of Lloyd's algorithm
field = Field(X)
for i in range(20):
  print(' * running iteration', i)
  plot(field.voronoi, i)
  field.relax()

结果是点移动就像在下面的gif中一样:

《Python:确保每个成对距离> =某个最小距离》” /></a></p><p>注意:上面的gif显示了无约束的Lloyd迭代,其中输出域可能非常大.对于在Python中构造约束Lloyd迭代的一些讨论和代码,我写了一点<a href=blog post.

点赞