Python:TypeError:不能将序列乘以'float'类型的非int

时间:2015-12-29 23:34:18

标签: python arrays loops tuples

所以,我有一个通过许多方程式进行评估的数组。这是我的所有代码。

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(希望是正确的)。

enter image description here

其中k定义为常数。

积分是称为质量方差的函数的一部分,其中

enter image description here

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'

希望,只要我的其余代码是正确的,他们必须是解决这个问题的解决方案。我现在还不知道该怎么做。

如果我在这篇文章中留下了任何信息,请通知我,我会尽力添加所需的帮助。

2 个答案:

答案 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来获取这些函数可能是值得的。