2017-02-23 62 views
-1

我最終想要繪製三個合併積分到其中每個積分評估z=np.linspace(1e+9,0)的Python - 功能不產生相同的二維陣列

enter image description here

import numpy as np 
import matplotlib.pyplab as plt 
import scipy as sp 
import scipy.integrate as integrate 

z = np.linspace(1e+9, 0, 1000) 
mass = 1000 
Omega_m0 = 0.3 
Omega_L0 = 0.7 
h = 0.7 


def FreeStreamLength(z, mass, Omega_m0, Omega_L0, h): 
    kb = 8.617e-5 ## kev K^-1 
    c = 3e+5 ## km/s 
    T0 = 2.7 ## K 
    T_uni = mass/kb 

    a = 1./(z+1.) 

    z_nr = T_uni/T0 - 1. ## redshift at non relativistic 
    a_nr = 1/(z_nr + 1.) ## scale factor at non relativistic 

    Omega_r0 = (4.2e-5)/h/h 
    a_eq = Omega_r0/Omega_m0 
    z_eq = 1/a_eq - 1 

    a1 = a[a <= a_nr] ## scale factor before particles become non-relativistic 
    a2 = a[a_nr <= a.all() <= a_eq] 
    a3 = a[a_eq <= a] 

    integrand = lambda x: 1./x/x/np.sqrt(Omega_m0/x/x/x + Omega_L0) 

epoch_nr = [ c/H0 *integrate.quad(integrand, 0, i)[0] for i in a1] 
epoch_nreq = [c/H0/a_nr * integrate.quad(integrand, a2, a_eq)[0] ] 
epoch_eq = [c/H0/a_eq * integrate.quad(integrand, i, 1)[0] for i in a3] 
return epoch_nr + epoch_nreq + epoch_eq 

z應該通過a陣列的特定部分,如此有效地,這些值應該相互關聯。

對於return行我組合了所有的列表來爲我的函數創建這個新的數組。

FSL = FreeStreamLength(z, mass, Omega_m0, Omega_L0, h) 

fig = plt.figure() 
ax = fig.add_subplot(111) 

ax.plot(z, FSL, color="blue", label=r"$z=0$") 
plt.show() 

我與ValueError: x and y must have same first dimension

爲什麼我的新名單不與名單,我以前還搭配回來了?

我相信它必須與我如何從傳遞的數組中迭代元素,然後才能在函數中定義被積函數。

+0

我無法運行腳本,因爲沒有定義'T_uni'和'T0' – gsmafra

+0

@gsmafra對不起,我編輯了導致它的不相關部分。所以再試一次。 – DarthLazar

+0

我仍然不能運行你的代碼,而沒有做出猜測和更正! – hpaulj

回答

0

我不知道你到底想要做什麼,但是當你將一個布爾數組索引到python中的另一個數組時,你會得到一個包含布爾數組爲True的元素的數組。

>>> import numpy as np 
>>> a = np.asarray([1,2,3]) 
>>> b = np.asarray([True,False,True]) 
>>> print(a[b]) 
array([1, 3]) 

這就是所發生的事情在這條線

a1 = a[a <= a_nr] ## scale factor before particles become non-relativistic 

而且,這裏

epoch_nr + epoch_nreq + epoch_eq 

要添加三個列表(其中兩個具有長度爲1)。當你這樣做,你得到這些名單追加,結果將有那些3所列出的長度總結:

>>> a = [1,2,3] 
>>> b = [1] 
>>> c = [1] 
>>> a + b + c 
[1, 2, 3, 1, 1] 
0

您是清楚地瞭解發生了錯誤,但我猜,在該xy錯誤信息對應於z,FSL輸入到plot。你打印過這兩個變量的形狀嗎?當你在這裏,檢查他們的dtype

我預計,從z = np.linspace(1e+9, 0, 1000)z是(1000,)浮點數。

但什麼是FSL?你的函數的縮進是關閉的,但我猜測它是epoch_nr + epoch_nreq + epoch_eq。我會說3個數組的總和,但不,這些是列表。所以它是3個列表的連接。

那麼這個清單的總長度是len(a1)+1+len(a3)

我們不應該通過你的代碼猜測每一步發生的事情。這是你的工作。當您在numpy中遇到尺寸問題時,請在代碼中的任何可疑點處開始打印形狀。不要猜測形狀應該是什麼!驗證它。


好吧,我跳過槍,試圖運行你的代碼。

a_nr <= a.all() <= a_eq應該做什麼?

a2 = a[(a_nr <= a) & (a <= a_eq)] 

但使len(a2) 4和len(a3) 1,其攪亂epoch_nreq積分(與a2邊界)。