python,加权linspace

时间:2013-02-24 12:17:00

标签: python numpy

任何人都可以告诉我最好的方法是生成一个0到100的(numpy)数组包含值,由一个(例如)正态分布函数加权,平均值为50,方差为5.所以还有更多50秒和更少(几乎没有)零和数百。我认为这个问题不应该太难解决,但我不知所措......

我想到了np.linspace,但似乎没有重量选项。

所以要明确一点:我不是一个从0到100的简单正态分布,而是类似0到100之间的数组,中间的值密度更高。

由于

3 个答案:

答案 0 :(得分:3)

您可以使用scipy的统计分布:

import numpy as np
from scipy import stats

# your distribution:
distribution = stats.norm(loc=50, scale=5)

# percentile point, the range for the inverse cumulative distribution function:
bounds_for_range = distribution.cdf([0, 100])

# Linspace for the inverse cdf:
pp = np.linspace(*bounds_for_range, num=1000)

x = distribution.ppf(pp)

# And just to check that it makes sense you can try:
from matplotlib import pyplot as plt
plt.hist(x)
plt.show()

当然,我承认起点和终点并不像这样,因为前后来回的数字不准确。

答案 1 :(得分:1)

重要的是要理解,您的问题不是完全可解决的,因为通常有限的离散样本不能完全重现您的分布。

您可以轻松地看到这一点,当您将问题的平凡版本称为[0,1]中具有相同分布的一组3个值时。这里结果[0,0,1]和[0,1,1]都是合理的。

但是,你可以解决问题粗略。如果您要求count元素中包含[0,1,...,N]元素的数组,其中给定的概率为p=[p0,p1,...,pN]并且已标准化(p0+...+pN==1),则元素的计数c_k结果数组中的k理论上是

c[k] = p[k]*count

但现在这些计数都是花车。你必须决定一种方法来“围绕”他们,同时保持他们的总和。这是由于你的问题定义不明确而产生的选择自由。

答案 2 :(得分:0)

>>> sorted([int(random.gauss(50,5)) for i in range(100)])
[33, 40, 40, 40, 40, 40, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 56, 56, 57, 57, 57, 57, 57, 57, 57, 58, 61]