Numpy 以指定的间距绘制随机点
我试图得到一个函数,在单位圆内绘制n个点,但我需要它们足够分散 例如,看起来像这样的东西: 是否可以编写一个具有两个参数的函数,Numpy 以指定的间距绘制随机点,numpy,matplotlib,Numpy,Matplotlib,我试图得到一个函数,在单位圆内绘制n个点,但我需要它们足够分散 例如,看起来像这样的东西: 是否可以编写一个具有两个参数的函数,n(点数)和min\u d(最小间距),使点为: a) 等距 b) 没有成对距离超过给定的min\u d 从均匀分布中取样的问题是,可能会出现两点几乎相互重叠的情况,我不希望出现这种情况。我需要为表示节点集群的网络图提供这种输入 编辑:我在这里找到了a)的答案,但b)我仍然找不到答案 提供此答案时,该问题要求随机数。因此,这个答案给出了一个随机数的解决方案。它忽略了
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的解决方案
你的问题太宽泛了。具体要求是什么?由于有效地清除点周围的空间不会使它们变得随机,问题是您还需要多少随机性?除此之外,展示你迄今为止所做的尝试确实有助于其他人理解实际问题。我通过问这个问题得到了我想要的答案。如果太宽了,我道歉。你会如何重新措辞?好吧,只有你知道我下面的答案是否回答了这个问题。客观上无法确定,因为问题太广泛了。这是胡乱猜测。当然,这并不意味着你应该继续问一些糟糕的问题,因为在这种情况下你确实得到了答案。你会如何重新表述?正如我所说的,考虑到在给定条件下分数不是随机的,你需要多少随机性?对基础分布是否有要求?是否有固定数量的点需要绘制?你做了什么来解决这个问题?您考虑过哪些资源,它们在多大程度上没有帮助?最接近您想要的代码是什么,在哪一点失败?你的问题太宽泛了。具体要求是什么?由于有效地清除点周围的空间不会使它们变得随机,问题是您还需要多少随机性?除此之外,展示你迄今为止所做的尝试确实有助于其他人理解实际问题。我通过问这个问题得到了我想要的答案。如果太宽了,我道歉。你会如何重新措辞?好吧,只有你知道我下面的答案是否回答了这个问题。客观上无法确定,因为问题太广泛了。这是胡乱猜测。当然,这并不意味着你应该继续问一些糟糕的问题,因为在这种情况下你确实得到了答案。你会如何重新表述?正如我所说的,考虑到在给定条件下分数不是随机的,你需要多少随机性?对基础分布是否有要求?是否有固定数量的点需要绘制?你做了什么来解决这个问题?您考虑过哪些资源,它们在多大程度上没有帮助?最接近您想要的代码是什么,在哪一点失败?另见。