【问题标题】:How to draw 2D random uniform samples from two ranges如何从两个范围内绘制二维随机均匀样本
【发布时间】:2018-04-10 13:21:48
【问题描述】:

我有两个变量的两对最小值和最大值。我想从这两个变量的均匀分布中抽取 n 个随机样本,位于它们的最小值和最大值之间。例如:

min_x = 0
max_x = 10
min_y = 0
max_y = 20

假设我抽取了三个样本。这些可能是:

[(4, 15), (8, 9), (0, 19)] # First value is drawn randomly with uniform probability between min_x and max_x, second value is drawn similarly between min_y and max_y

如何使用 numpy 以简单的方式实现这一点?

我想出了这个:

>>> min_x = 0
>>> max_x = 10
>>> min_y = 0
>>> max_y = 20
>>> sample = np.random.random_sample(2)
>>> sample[0] = (sample[0]) * max_x - min_x
>>> sample[1] = (sample[1]) * max_y - min_y
>>> sample
array([ 1.81221794, 18.0091034 ])

但我觉得应该有一个更简单的解决方案。

编辑:不是重复的。建议的重复问题的答案涉及整数。

【问题讨论】:

  • 为什么不直接把你写的功能放到一个函数中呢?我认为这种方法没有任何问题。
  • Numpy Random 2D Array的可能重复
  • 我可以。只是想知道是否有更简单的方法
  • 实际上,我会审查您的方法。考虑您的最小值大于 sample 包含的值的情况。你最终会得到一个负值......
  • 感谢您的提醒。已排序。

标签: python numpy


【解决方案1】:

numpy 中大多数随机生成函数的参数在数组上运行。以下代码生成 10 个样本,其中第一列来自 (0, 10) 均匀分布,第二列来自 (0, 20)。

n = 10
xy_min = [0, 0]
xy_max = [10, 20]
data = np.random.uniform(low=xy_min, high=xy_max, size=(n,2))
print(data)

输出是

[[ 5.93168121,  7.36060232],
 [ 6.0681728 ,  8.83458336],
 [ 3.51412518,  7.86395892],
 [ 5.28704184, 11.2423749 ],
 [ 8.14407888,  6.30980757],
 [ 8.93337281, 13.39148231],
 [ 6.94694921, 19.50003171],
 [ 2.52280804, 13.21572422],
 [ 3.41855383,  2.56327567],
 [ 4.06155783,  3.95026796]]

【讨论】:

    【解决方案2】:

    我认为您可以只使用np.random.uniform,它专门从均匀分布中抽取样本。它采用参数highlowsize,因此您可以使用min_xmax_xmin_ymax_y 绘制2 个大小为3 的样本作为您的高点和低点,然后压缩两个一起:

    list(zip(np.random.uniform(min_x,max_x,3), np.random.uniform(min_y,max_y,3)))
    #[(5.3104205843005658, 13.505026912687656), (9.2780870724003979, 7.6835513126639921), (8.0256063658604635, 12.539814624240064)]
    

    请注意,间隔是半开的[low, high)(请参阅链接文档)

    【讨论】:

    • 不要整数
    • 但我想我可以压缩从每个范围中抽取的两个不同的随机均匀向量
    • 啊,好吧,从你的例子中我认为你做到了。在这种情况下,您可以使用np.random.uniform。查看修改
    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 2010-10-01
    • 2018-03-31
    相关资源
    最近更新 更多