3

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

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

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

4

3 回答 3

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(或非常接近)

于 2013-03-19T05:05:15.770 回答
2

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

也不清楚您是否希望实际数组的平均值为 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))
于 2013-03-19T04:50:49.667 回答
-2

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

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

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

然而,小问题是它强制样本上的三角形分布。

于 2013-03-19T04:56:01.590 回答