【问题标题】:Create a random array with a particular average创建具有特定平均值的随机数组
【发布时间】:2013-03-07 15:56:53
【问题描述】:

我正在使用 scipy,并希望创建一个长度为 n 且具有特定平均值的数组。

假设我想要一个长度为 3、平均为 2.5 的随机数组,因此可能的选项可能是: [1.5、3.5、2.5] [.25, 7.2, .05] 等等等等……

我需要创建许多具有不同长度和不同平均值(指定)的此类数组,因此欢迎使用通用解决方案。

【问题讨论】:

  • 平均值是否必须准确,或者您可以将随机数重新集中在您想要的平均值周围,即如果您的标准随机浮点数[0,1) 的长期平均值为 0.5,那么您可以通过添加 2... 将中心移动到 2.5
  • 列表中的数字是否限制为非负数?如果没有限制,我想你可以只用随机数填写列表,除了最后一个,然后根据其他数字和平均值计算最后一个数字。
  • 是的,数字必须是非负数。

标签: python arrays random numpy scipy


【解决方案1】:

你还没有指定你想要的分布。

也不清楚您是否希望实际数组的平均值为 2.5,或者所有数组的摊销平均值为 2.5。

最简单的解决方案——从 0 到 2*avg 的均匀分布中的三个随机数——是这样的:

return 2*avg * np.random.rand(3)

如果你想保证数组的平均值是 2.5,这是一个非常简单的约束,但是有很多不同的方法可以满足它,你需要描述你想要的方法。例如:

n0 = random.random() * 2*avg
n1 = random.random() * (2*avg - n0)
n2 = random.random() * (2*avg - n0 - n1)
return np.array((n0, n1, n2))

【讨论】:

    【解决方案2】:

    我找到了解决问题的办法。

    numpy.random.triangular(left, mode, right, size=None)

    访问:http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.triangular.html#numpy.random.triangular

    不过,小问题是它会强制样本呈三角形分布。

    【讨论】:

    • 但是你想要什么样的分布?
    【解决方案3】:

    只需生成您想要的范围内的数字(在本例中为 0...10)

    >>> import random
    >>> nums = [10*random.random() for x in range(5)]
    

    计算平均值

    >>> sum(nums)/len(nums)
    4.2315222659844824
    

    将平均值移到您想要的位置

    >>> nums = [x - 4.2315222659844824 + 2.5 for x in nums]
    >>> nums
    [-0.628013346633133, 4.628537956666447, -1.7219257458163257, 7.617565127420011, 2.6038360083629986]
    >>> sum(nums)/len(nums)
    2.4999999999999996
    

    您可以使用您喜欢的任何分布/范围。通过以这种方式移动平均值,您的平均值始终为 2.5(或非常接近)

    【讨论】:

      猜你喜欢
      • 2014-11-03
      • 2015-07-06
      • 2011-08-15
      • 2013-07-07
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多