2013-02-26 129 views
4

我想用Numpy的隨機指數分佈創建一個隨機數組的數組。我有這個工作正常,但我有一個額外的要求,我的項目,這是能夠精確指定有多少數組元素有一定的價值。讓我解釋一下(代碼如下,但我會在這裏解釋一下):我生成我的隨機指數分佈並繪製數據的直方圖,產生一個很好的指數曲線。我真正想要做的是使用變量來指定此曲線的y截距(曲線與y軸相交的點)。我可以通過改變直方圖中的bin數來實現這一點,但這隻會改變圖而不會改變原始數據。在Python中操作numpy.random.exponential分佈

我在這裏插入了我的代碼的骨骼。爲了給出一些上下文,我試圖創建一個星系的指數圓盤,因此我想要生成的隨機數組是一個半徑數組,我希望能夠指定的變量是星系中心的數字密度:

import numpy as N 
import matplotlib.pyplot as P 

n = 1000  
scale_radius = 2 
central_surface_density = 100 #I would like this to be the controlling variable, even if it's specification had knock on effects on n. 

radius_array = N.random.exponential(scale_radius,(n,1))  

P.figure()  
nbins = 100 
number_density, radii = N.histogram(radius_array, bins=nbins,normed=False) 
P.plot(radii[0:-1], number_density) 
P.xlabel('$R$') 
P.ylabel(r'$\Sigma$') 
P.ylim(0, central_surface_density) 
P.legend()  
P.show() 

此代碼創建以下直方圖:

enter image description here

因此,要總結,我希望能夠指定該地塊通過控制我如何」截取y軸已經生成了數據,而不是通過改變柱狀圖的繪製方式。

任何幫助或要求進一步澄清將非常感激。

回答

7

根據numpy.random.exponential的文檔,輸入參數β對於exponential described in wikipedia的定義是1/lambda。

你想要的是這個函數在f(x=0)=lambda=1/beta評估。因此,在一個賦範分佈,你y軸截距應該僅僅是numpy的函數的反函數:

import numpy as np 
import pylab as plt 

target = 250 
beta = 1.0/target 

Y = np.random.exponential(beta, 5000) 
plt.hist(Y, normed=True, bins=200,lw=0,alpha=.8) 
plt.plot([0,max(Y)],[target,target],'r--') 
plt.ylim(0,target*1.1) 
plt.show() 

enter image description here

是在直方圖的截距將與不同的塊大小變化,但這並不意味着什麼。在這裏你可以合理地談論的唯一事情是底層概率分佈(因此normed=true

+0

這正是我所需要的。非常感謝你。 – user2111574 2013-02-26 15:33:12

+0

如果你不知道normed = true做什麼,請點擊這裏:https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.htm 基本上,它繪製了「在箱上的概率密度函數,歸一化,使得該範圍上的積分是1「 – 2017-05-09 16:52:00