创建具有特定平均值的随机数组

时间:2013-03-19 04:44:42

标签: python arrays random numpy scipy

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

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

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

3 个答案:

答案 0 :(得分:9)

只需在您想要的范围内生成数字(在这种情况下为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(或非常接近它)

答案 1 :(得分:2)

您尚未指定所需的分发。

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

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

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 :(得分:-2)

我找到了问题的解决方案。

numpy.random.triangular(左,模式,右,大小=无)

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

然而,小问题是它会在样品上施加三角形分布。