2015-12-31 20 views
0

我對這個冗長的標題表示歉意。我一直在爲一個項目工作了一段時間,而且我對代碼中的某個部分很感興趣。我盡我所能徹底。集成一個返回相同大小的數組而不是在Python中的元組的數組?

我有羣衆的numpy的陣列中,M,尺寸和形狀167197.

## Non-constant 
M = data['m200'] # kg // Mass of dark matter haloes 

R = [] # Km // Radius of sphere 
for masses in M: 
    R.append(((3*masses)/(RHO_C*4*(3.14))**(1.0/3.0))) 

我有屬於我的問題的部分k的獨立的值擬合函數。 k是我的代碼中定義的值。

def T(k): # Fitting Function // Assuming a lambdaCDM model 
    q = k/((OMEGA_M)*H**2)*((T_CMB)/27)**2 
    L = np.log(euler+1.84*q) 
    C = 14.4 + 325/(1+60.5*q**1.11) 
    return L/(L+C*q**2) 

############################################################################## 

def P(k): # Linear Power Spectrum 
    A = 0.75 # LambdaCDM Power Normalization 
    n = 0.95 # current constraints from WMAP+LSS 
    return A*k**n*T(k)**2 

*對於實際問題*

我有一個傅立葉transfrom w ^(KR)

enter image description here

def W(R):# Fourier Transfrom of Top Hat function 
    return (3*(np.sin(k*R)-(k*R)*np.cos(k*R)))/(k*R)**(3) 
W_a = [] 
for radii in R: 
    W_a.append(W(radii)) 

在這種情況下,我治療R作爲獨立的價值而不是kR的組合

打印W_a的長度給了我與mu numpy數組完全相同的大小,所以一切都很好。

此功能將發揮作用的整體隨着包括在西格瑪

enter image description here

def sigma(R): # Mass Varience 
    k1 = lambda k: k**2*P(k)*W(R)**2 
    norm1 = 1/(2*np.pi**2) 
    return (integrate.quad(k1, 0, np.Inf)) 
sigma_a = [] 
for radii in R: 
    sigma_a.extend(sigma(radii)) 

積分的這一功能會創建一個元組,當然。但是對於R中的每個值,我想創建一個列表或一個數組。因此,當使用.extend()時,我的陣列長度現在加倍,長度現在爲334394.

如何將它修正爲積分評估W(kR)中每個R的位置,返回相同大小的數組, 167197?

回答

1

首先只是一個Python注:

R = [] # Km // Radius of sphere 
for masses in M: 
    R.append(((3*masses)/(RHO_C*4*(3.14))**(1.0/3.0))) 

可以表示爲:

R = [((3*masses)/(RHO_C*4*(3.14))**(1.0/3.0)) for masses in M] 

在:

return (integrate.quad(k1, 0, np.Inf)) 

外集()不會有所作爲。

return integrate.quad(k1, 0, np.Inf) 

應該返回相同的東西。

現在雙倍從哪裏來?在quad文檔中,我們看到它返回2個值,即整數和誤差項。這顯示爲在一些例子中,元組,但它也解開別人:

y, err = integrate.quad(f, 0, 1, args=(3,)) 

如果你只想整體,而不是犯錯,你能指標,integate...()[0]

sigma_a = [] 
for radii in R: 
    sigma_a.append(sigma(radii)[0]) 

sigma_a = [sigma(radii)[0] for radii in R] 

def sigma1(R): # Mass Varience 
    k1 = lambda k: k**2*P(k)*W(R)**2 
    norm1 = 1/(2*np.pi**2) 
    y, err = integrate.quad(k1, 0, np.Inf) 
    return y # return just the integral 

sigma_a = [sigma1(radii) for radii in R] 

如果你想同時收集yerr,但在單獨的列表,使用zip*重新包裝他們(有點像numpy的轉置) 。

ll = [sigma(radii) for radii in R] 
# [(y0,err0),(y1,err1), ...] 
ys, errs = zip(*ll) 
相關問題