2013-02-24 89 views
2

任何人都可以告訴我什麼是最好的方法是生成一個(numpy)數組從0到100,這是加權的(例如)正態分佈函數與平均50和方差5。有50多個和更少(幾乎沒有)零和幾百個。我認爲這個問題不應該太難解決,但我被困在某種程度上......蟒蛇,加權linspace

我想到了與np.linspace的東西,但它似乎沒有重量選項。

所以說清楚一點:我不想從0到100的簡單正態分佈,而是像從0到100的數組,中間值的密度更高。

感謝

+1

你試過'numpy.random.normal(50,5,size = 10)'嗎? – jfs 2013-02-24 12:28:27

+0

是的,我有;但這並不是我正在尋找的,因爲我不喜歡它中的隨機部分。我更喜歡那些正常分佈(幾乎)的東西,因爲我處理的不是那麼大的採樣率 – wa4557 2013-02-24 12:38:46

回答

1

重要的是要明白,你的問題不是正好可解,因爲通常有限的離散樣本不能準確地重現你的分佈。

在[0,1]中以平均分佈的形式詢問您的問題的簡單版本,如[0,1]中的一組3個值時,您可以很容易地看到這一點。這裏結果[0,0,1]和[0,1,1]都是合理的。

但是,您可以解決問題大致。如果你問與count元素出[0,1,...,N]在給定的概率p=[p0,p1,...,pN]和標準化(p0+...+pN==1),然後算你所得數組中的元素kc_k陣列理論上

c[k] = p[k]*count 

但這些計數現在彩車。你必須決定一種方法來「保留」他們的總數。這是您的問題的定義不明所引起的選擇自由。

+0

很酷,很好的答案 – wa4557 2013-02-26 21:25:52

1

您可以使用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() 

當然,我承認開始並來回當終點是不太確切這樣,由於數值不準確。

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]