所以,我有一个通过许多方程式进行评估的数组。这是我的所有代码。
os.chdir( path )
data = np.load('msii_phasespace.npy',mmap_mode='r')
# data.size: 167197
# data.shape: (167197,)
# data.dtype: dtype([('x', '<f4'), ('y', '<f4'), ('z', '<f4'),
# ('velx', '<f4'), ('vely', '<f4'), ('velz', '<f4'), ('m200', '<f4')])
##############################################################################
## 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)))
kR = []
for radii in R:
kR.append(k*radii)
我有常量,但它们并不值得一提
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 = [] # Fourier Transfrom in the top hat function
for values in kR:
W.append(((3*(np.sin(values)-values*np.cos(values)))/(values)**(3)))
integral1 = []
for values1 in W:
k1 = lambda k: k**2*P(k)*values1**2
integral1.append(integrate.quad(k1, 0, np.Inf))
我将傅立叶数组W的每个值集成到一个新数组integer1,它正在评估P(k),k和W都是k(希望是正确的)。
其中k定义为常数。
积分是称为质量方差的函数的一部分,其中
sigma = [] # Mass Varience
for values2 in integral1:
norm1 = 1/(2*np.pi**2)
sigma.append((norm1*values2)**(0.5))
我正在尝试创建一个新数组sigma,使用我定义为integral1的每个值的质量方差。
我的问题是,在这个数组上应用for循环时,在我与其他for循环的比较中尝试使用这个数组是不够的。
我一直收到错误TypeError: can't multiply sequence by non-int of type 'float'
希望,只要我的其余代码是正确的,他们必须是解决这个问题的解决方案。我现在还不知道该怎么做。
如果我在这篇文章中留下了任何信息,请通知我,我会尽力添加所需的帮助。
答案 0 :(得分:1)
当你在元组上使用*
运算符时,你不会对向量中的每个项进行标量乘法运算,而是通过右侧的操作数重复元组:
>>> (4, 5, 6) *3
(4, 5, 6, 4, 5, 6, 4, 5, 6)
做一个乘法,你可以做这样的列表理解:
[i * 3 for i in (4, 5, 6)]
答案 1 :(得分:0)
假设你的序列是一个列表对象,通过列表(向量)多个常量(或标量),你需要使用像
这样的东西k=10
arr=[1,2,3,4]
newarr=map(lambda x: k*x, arr)
或者,默认情况下使用numpy来获取这些函数可能是值得的。