代码之家  ›  专栏  ›  技术社区  ›  Sahand

如何从两个范围内绘制二维随机均匀样本

  •  6
  • Sahand  · 技术社区  · 8 年前

    对于两个变量,我有两对最小值和最大值。我想从这两个变量的均匀分布中抽取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 ])
    

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

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

    2 回复  |  直到 8 年前
        1
  •  15
  •   alexdor    8 年前

    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
  •  3
  •   sacuL    8 年前

    我想你可以用 np.random.uniform ,它专门从均匀分布中提取样本。它需要参数 high ,则, low 和 size ,因此可以使用 min_x ,则, max_x ,则, min_y 和 max_y 作为你的高潮和低谷,并将两者联系在一起:

    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) (参见链接文档)