在python中集成一个返回相同大小数组而不是元组的数组?

时间:2015-12-31 22:06:00

标签: python arrays numpy tuples integration

我为漫长的头衔道歉。我已经在一个项目上工作了一段时间,我在我的代码的某个部分处于一个车辙。我会竭尽所能彻底。

我有一个块状的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

*对于实际问题*

我有一个傅里叶变换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数组完全相同的大小,所以一切都很好。

此函数将作为积分的一部分,并包含在sigma

的此函数中

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 个答案:

答案 0 :(得分: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)