任何人都可以告訴我什麼是最好的方法是生成一個(numpy)數組從0到100,這是加權的(例如)正態分佈函數與平均50和方差5。有50多個和更少(幾乎沒有)零和幾百個。我認爲這個問題不應該太難解決,但我被困在某種程度上......蟒蛇,加權linspace
我想到了與np.linspace的東西,但它似乎沒有重量選項。
所以說清楚一點:我不想從0到100的簡單正態分佈,而是像從0到100的數組,中間值的密度更高。
感謝
任何人都可以告訴我什麼是最好的方法是生成一個(numpy)數組從0到100,這是加權的(例如)正態分佈函數與平均50和方差5。有50多個和更少(幾乎沒有)零和幾百個。我認爲這個問題不應該太難解決,但我被困在某種程度上......蟒蛇,加權linspace
我想到了與np.linspace的東西,但它似乎沒有重量選項。
所以說清楚一點:我不想從0到100的簡單正態分佈,而是像從0到100的數組,中間值的密度更高。
感謝
重要的是要明白,你的問題不是正好可解,因爲通常有限的離散樣本不能準確地重現你的分佈。
在[0,1]中以平均分佈的形式詢問您的問題的簡單版本,如[0,1]中的一組3個值時,您可以很容易地看到這一點。這裏結果[0,0,1]和[0,1,1]都是合理的。
但是,您可以解決問題大致。如果你問與count
元素出[0,1,...,N]
在給定的概率p=[p0,p1,...,pN]
和標準化(p0+...+pN==1
),然後算你所得數組中的元素k
的c_k
陣列理論上
c[k] = p[k]*count
但這些計數現在彩車。你必須決定一種方法來「保留」他們的總數。這是您的問題的定義不明所引起的選擇自由。
很酷,很好的答案 – wa4557 2013-02-26 21:25:52
您可以使用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()
當然,我承認開始並來回當終點是不太確切這樣,由於數值不準確。
>>> 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]
你試過'numpy.random.normal(50,5,size = 10)'嗎? – jfs 2013-02-24 12:28:27
是的,我有;但這並不是我正在尋找的,因爲我不喜歡它中的隨機部分。我更喜歡那些正常分佈(幾乎)的東西,因爲我處理的不是那麼大的採樣率 – wa4557 2013-02-24 12:38:46