gpt4 book ai didi

python - 如何在python或R中统一生成半圆内的一组随机点?

转载 作者:行者123 更新时间:2023-11-28 20:31:13 25 4
gpt4 key购买 nike

我试图在一个半圆内均匀地生成一组点。

size = 1000
t = np.random.random(size)*np.pi*2
u = np.random.random(size) + np.random.random(size)
r = np.where(u > 1, 2 - u, u)
x = r*cos(t)
y = r*sin(t)
coor = (x,y)
for idx, value in enumerate(y):
if value<0:
x[idx]=-3
y[idx]=-3
f, ax = plt.subplots(figsize = (3,3))
plt.scatter(x, y)

这段代码有2个错误。

  1. 情节有很多(-3,-3)点要删除
  2. 这似乎是低效的。

下图不是统一的,因为点比其他点更中心。

enter image description here

下图所示的另一个图可以看作是一致的。

enter image description here

任何修复错误的想法将不胜感激。

最佳答案

您应该生成均匀分布的角phi,并采用均匀生成的半径rsqrt(考虑到我们想要在区域上均匀采样,请参阅下面的解释),以确保您在半圆中均匀采样点。

import numpy as np
import matplotlib.pyplot as plt

# sample
size = 10000
R = 1
phi = np.random.random(size=size) * np.pi
r = np.sqrt(np.random.random(size=size)) * R

# transform
x = r * np.cos(phi)
y = r * np.sin(phi)

# plot
f = plt.figure(figsize=(12,12))
a = f.add_subplot(111)
a.scatter(x, y, marker='.')
a.set_aspect('equal')
plt.show()

Uniform samples in a cirlce

说明

要在(半)圆上生成均匀分布的点,我们必须确保每个无穷小的区域或线段以相同的概率“命中”。我们可以简单地从均匀随机分布 [0, 1) 中采样 phi,乘以 np.pi(所以 [0, pi)), 因为所有的角度都应该有相同的概率被采样。但是,如果我们从 [0, 1) 中的均匀随机分布中采样 r,我们会在小半径处生成太多点,而在大半径处生成的点不够,因为 < em>area 像 r**2 一样增长。考虑到这一事实,我们必须相应地偏置我们的采样半径,在这种情况下,我们可以通过简单地取平方根 (np.sqrt) 来应用偏置,以将正确的权重应用到采样的半径值,并考虑外环的较大区域。

这里有一个更好更全面的解释:https://stackoverflow.com/a/50746409/1170207

与拒绝抽样方法的性能比较

由于这种方法基本上是一种反采样方法,我们比较它的拒绝抽样算法的性能。

import numpy as np
x, y = np.random.random(size=(2,10000))
%timeit r, phi = np.sqrt(x), y
# 19 µs ± 33.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit m = x**2 + y**2 <= 1; xx, yy = x[m], y[m]
# 81.5 µs ± 271 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

使用拒绝抽样方法,我们也无法确保我们抽取了选定数量的变量,因此我们必须重复该过程,直到我们有。这不能很好地矢量化,除非我们接受对太多值进行采样并丢弃其他值。

关于python - 如何在python或R中统一生成半圆内的一组随机点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55333510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com