Numpy 以指定的间距绘制随机点

Numpy 以指定的间距绘制随机点,numpy,matplotlib,Numpy,Matplotlib,我试图得到一个函数,在单位圆内绘制n个点,但我需要它们足够分散 例如,看起来像这样的东西: 是否可以编写一个具有两个参数的函数,n(点数)和min\u d(最小间距),使点为: a) 等距 b) 没有成对距离超过给定的min\u d 从均匀分布中取样的问题是,可能会出现两点几乎相互重叠的情况,我不希望出现这种情况。我需要为表示节点集群的网络图提供这种输入 编辑:我在这里找到了a)的答案,但b)我仍然找不到答案 提供此答案时,该问题要求随机数。因此,这个答案给出了一个随机数的解决方案。它忽略了

我试图得到一个函数,在单位圆内绘制n个点,但我需要它们足够分散

例如,看起来像这样的东西:

是否可以编写一个具有两个参数的函数,
n
(点数)和
min\u d
(最小间距),使点为:

a) 等距

b) 没有成对距离超过给定的
min\u d

从均匀分布中取样的问题是,可能会出现两点几乎相互重叠的情况,我不希望出现这种情况。我需要为表示节点集群的网络图提供这种输入


编辑:我在这里找到了a)的答案,但b)我仍然找不到答案

提供此答案时,该问题要求随机数。因此,这个答案给出了一个随机数的解决方案。它忽略了之后对问题所做的任何编辑

On可以简单地抽取随机点,并针对每个点检查是否满足最小距离的条件。如果没有,则可以放弃该点。在列表中填入足够的点或满足某些中断条件之前,可以执行此操作

import numpy as np
import matplotlib.pyplot as plt

class Points():
    def __init__(self,n=10, r=1, center=(0,0), mindist=0.2, maxtrials=1000 ) :
        self.success = False
        self.n = n
        self.r = r
        self.center=np.array(center)
        self.d = mindist
        self.points = np.ones((self.n,2))*10*r+self.center
        self.c = 0
        self.trials = 0
        self.maxtrials = maxtrials
        self.tx = "rad: {}, center: {}, min. dist: {} ".format(self.r, center, self.d)
        self.fill()

    def dist(self, p, x):
        if len(p.shape) >1:
            return np.sqrt(np.sum((p-x)**2, axis=1))
        else:
            return np.sqrt(np.sum((p-x)**2))

    def newpoint(self):
        x = (np.random.rand(2)-0.5)*2
        x = x*self.r-self.center
        if self.dist(self.center, x) < self.r:
            self.trials += 1
            if np.all(self.dist(self.points, x) > self.d):
                self.points[self.c,:] = x
                self.c += 1

    def fill(self):
        while self.trials < self.maxtrials and self.c < self.n:
            self.newpoint()
        self.points = self.points[self.dist(self.points,self.center) < self.r,:]
        if len(self.points) == self.n:
            self.success = True
        self.tx +="\n{} of {} found ({} trials)".format(len(self.points),self.n,self.trials)

    def __repr__(self):
        return self.tx


center =(0,0)
radius = 1 

p  = Points(n=40,r=radius, center=center)

fig, ax = plt.subplots()
x,y = p.points[:,0], p.points[:,1]

plt.scatter(x,y)
ax.add_patch(plt.Circle(center, radius, fill=False))

ax.set_title(p)
ax.relim()
ax.autoscale_view()
ax.set_aspect("equal")
plt.show()
在这里,可以找到最小距离为0.15的解决方案

在提供此答案时,该问题要求随机数。因此,这个答案给出了一个随机数的解决方案。它忽略了之后对问题所做的任何编辑

On可以简单地抽取随机点,并针对每个点检查是否满足最小距离的条件。如果没有,则可以放弃该点。在列表中填入足够的点或满足某些中断条件之前,可以执行此操作

import numpy as np
import matplotlib.pyplot as plt

class Points():
    def __init__(self,n=10, r=1, center=(0,0), mindist=0.2, maxtrials=1000 ) :
        self.success = False
        self.n = n
        self.r = r
        self.center=np.array(center)
        self.d = mindist
        self.points = np.ones((self.n,2))*10*r+self.center
        self.c = 0
        self.trials = 0
        self.maxtrials = maxtrials
        self.tx = "rad: {}, center: {}, min. dist: {} ".format(self.r, center, self.d)
        self.fill()

    def dist(self, p, x):
        if len(p.shape) >1:
            return np.sqrt(np.sum((p-x)**2, axis=1))
        else:
            return np.sqrt(np.sum((p-x)**2))

    def newpoint(self):
        x = (np.random.rand(2)-0.5)*2
        x = x*self.r-self.center
        if self.dist(self.center, x) < self.r:
            self.trials += 1
            if np.all(self.dist(self.points, x) > self.d):
                self.points[self.c,:] = x
                self.c += 1

    def fill(self):
        while self.trials < self.maxtrials and self.c < self.n:
            self.newpoint()
        self.points = self.points[self.dist(self.points,self.center) < self.r,:]
        if len(self.points) == self.n:
            self.success = True
        self.tx +="\n{} of {} found ({} trials)".format(len(self.points),self.n,self.trials)

    def __repr__(self):
        return self.tx


center =(0,0)
radius = 1 

p  = Points(n=40,r=radius, center=center)

fig, ax = plt.subplots()
x,y = p.points[:,0], p.points[:,1]

plt.scatter(x,y)
ax.add_patch(plt.Circle(center, radius, fill=False))

ax.set_title(p)
ax.relim()
ax.autoscale_view()
ax.set_aspect("equal")
plt.show()
在这里,可以找到最小距离为0.15的解决方案


你的问题太宽泛了。具体要求是什么?由于有效地清除点周围的空间不会使它们变得随机,问题是您还需要多少随机性?除此之外,展示你迄今为止所做的尝试确实有助于其他人理解实际问题。我通过问这个问题得到了我想要的答案。如果太宽了,我道歉。你会如何重新措辞?好吧,只有你知道我下面的答案是否回答了这个问题。客观上无法确定,因为问题太广泛了。这是胡乱猜测。当然,这并不意味着你应该继续问一些糟糕的问题,因为在这种情况下你确实得到了答案。你会如何重新表述?正如我所说的,考虑到在给定条件下分数不是随机的,你需要多少随机性?对基础分布是否有要求?是否有固定数量的点需要绘制?你做了什么来解决这个问题?您考虑过哪些资源,它们在多大程度上没有帮助?最接近您想要的代码是什么,在哪一点失败?你的问题太宽泛了。具体要求是什么?由于有效地清除点周围的空间不会使它们变得随机,问题是您还需要多少随机性?除此之外,展示你迄今为止所做的尝试确实有助于其他人理解实际问题。我通过问这个问题得到了我想要的答案。如果太宽了,我道歉。你会如何重新措辞?好吧,只有你知道我下面的答案是否回答了这个问题。客观上无法确定,因为问题太广泛了。这是胡乱猜测。当然,这并不意味着你应该继续问一些糟糕的问题,因为在这种情况下你确实得到了答案。你会如何重新表述?正如我所说的,考虑到在给定条件下分数不是随机的,你需要多少随机性?对基础分布是否有要求?是否有固定数量的点需要绘制?你做了什么来解决这个问题?您考虑过哪些资源,它们在多大程度上没有帮助?最接近您想要的代码是什么,在哪一点失败?另见。