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

标签 python r numpy

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

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/

相关文章:

Python正则表达式解析流

python - 使用 Beautiful Soup 和 Python 解析元标记

python - 如何将列表文本中的数字与字母分开

R编程: Creating a list of paired elements

r - 如何将数据框转换为 R 中的列联表?

python - django_auth_ldap 自定义 AUTH_USER_MODEL IntegrityError

java - 异常:"attempt to access org.rosuda.REngine.REXPGenericVector as String"

python - 提取 numpy 结构化数组的最高值

python - Pandas => 按组获取第一个和最后一个元素的索引

python - 是否有用于分箱数据的 sci.stats.moment 函数?