【问题标题】:TypeError 'float' object has no attribute '__getitem__' in array assignmentTypeError 'float' 对象在数组赋值中没有属性 '__getitem__'
【发布时间】:2016-02-06 06:16:24
【问题描述】:

与我之前的问题有关:Having much trouble with 'preallocating cell arrays' in Python

我实施了这些建议,现在有两个代码 - 一个在 scipy 中运行 odeint,另一个运行 vode。他们都给了我同样的错误,我不知道如何解决。

这是我的注释代码:

import numpy as np
from scipy.integrate import odeint

#Constants and parameters
N = 2
K00 = np.logspace(0,3,101,10)
len1 = len(K00)
epsilon = 0.01
y0 = [0]*(3*N/2+3)
u1 = 0
u2 = 0
u3 = 0
Kplot = np.zeros((len1,1))
Pplot = np.zeros((len1,1))
S = [np.zeros((len1,1)) for kkkk in range(N/2+1)]
KS = [np.zeros((len1,1)) for kkkk in range(N/2+1)]
PS = [np.zeros((len1,1)) for kkkk in range(N/2+1)]
Splot = [np.zeros((len1,1)) for kkkk in range(N/2+1)]
KSplot = [np.zeros((len1,1)) for kkkk in range(N/2+1)]
PSplot = [np.zeros((len1,1)) for kkkk in range(N/2+1)]

for alpha in range(0,(N/2+1)):
    Splot[alpha] = np.zeros((len1,1))
for beta in range((N/2)+1,N+1):
    KSplot[beta-N/2-1] = np.zeros((len1,1))
for gamma in range(N+1,3*N/2+1):
    PSplot[gamma-N] = np.zeros((len1,1))

for series in range(0,len1):
    K0 = K00[series]
    Q = 10
    r1 = 0.0001
    r2 = 0.001
    a = 0.001
    d = 0.001
    k = 0.999
    S10 = 1e5
    P0 = 1
    tfvec = np.tile(1e10,(1,5))
    tf = tfvec[0,0]
    time = np.linspace(0,tf,len1)

    #Defining dy/dt's
    def f(t,y):
        for alpha in range(0,(N/2+1)):
            S[alpha] = y[alpha]
        for beta in range((N/2)+1,N+1):
            KS[beta-N/2-1] = y[beta]
        for gamma in range(N+1,3*N/2+1):
            PS[gamma-N] = y[gamma]
        K = y[3*N/2+1]
        P = y[3*N/2+2]

        # The model equations
        ydot = np.zeros((3*N/2+3,1))
        B = range((N/2)+1,N+1)
        G = range(N+1,3*N/2+1)
        runsumPS = 0
        runsum1 = 0
        runsumKS = 0 
        runsum2 = 0

        for m in range(0,N/2):
            runsumPS = runsumPS + PS[m+1]
            runsum1 = runsum1 + S[m+1]
            runsumKS = runsumKS + KS[m]
            runsum2 = runsum2 + S[m]    
            ydot[B[m]] = a*K*S[m]-(d+k+r1)*KS[m]

        for i in range(0,N/2-1):
            ydot[G[i]] = a*P*S[i+1]-(d+k+r1)*PS[i+1]

        for p in range(1,N/2):
            ydot[p] = -S[p]*(r1+a*K+a*P)+k*KS[p-1]+ \
                      d*(PS[p]+KS[p])

        ydot[0] = Q-(r1+a*K)*S[0]+d*KS[0]+k*runsumPS
        ydot[N/2] = k*KS[N/2-1]-(r2+a*P)*S[N/2]+ \
                    d*PS[N/2]
        ydot[G[N/2-1]] = a*P*S[N/2]-(d+k+r2)*PS[N/2]
        ydot[3*N/2+1] = (d+k+r1)*runsumKS-a*K*runsum2
        ydot[3*N/2+2] = (d+k+r1)*(runsumPS-PS[N/2])- \
                        a*P*runsum1+(d+k+r2)*PS[N/2]

        for j in range(0,3*N/2+3):
            return ydot[j] 

    # Initial conditions
    y0[0] = S10
    for i in range(1,3*N/2+1):
        y0[i] = 0
    y0[3*N/2+1] = K0
    y0[3*N/2+2] = P0

    # Solve the DEs
    soln = odeint(f,y0,time)
    for alpha in range(0,(N/2+1)):
        S[alpha] = soln[:,alpha]
    for beta in range((N/2)+1,N+1):
        KS[beta-N/2-1] = soln[:,beta]   
    for gamma in range(N+1,3*N/2+1):
        PS[gamma-N] = soln[:,gamma]

    for alpha in range(0,(N/2+1)):
        Splot[alpha][series] = soln[len1-1,alpha]
    for beta in range((N/2)+1,N+1):
        KSplot[beta-N/2-1][series] = soln[len1-1,beta]
    for gamma in range(N+1,3*N/2+1):
        PSplot[gamma-N][series] = soln[len1-1,gamma]

    for alpha in range(0,(N/2+1)):
        u1 = u1 + Splot[alpha]
    for beta in range((N/2)+1,N+1):
        u2 = u2 + KSplot[beta-N/2-1]
    for gamma in range(N+1,3*N/2+1):
        u3 = u3 + PSplot[gamma-N]

    K = soln[:,3*N/2+1]
    P = soln[:,3*N/2+2]
    Kplot[series] = soln[len1-1,3*N/2+1]
    Pplot[series] = soln[len1-1,3*N/2+2]
    utot = u1+u2+u3

错误信息如下:

     45     def f(t,y):
     46         for alpha in range(0,(N/2+1)):
---> 47             S[alpha] = y[alpha]
     48         for beta in range((N/2)+1,N+1):
     49             KS[beta-N/2-1] = y[beta]

TypeError: 'float' object has no attribute '__getitem__' 

我需要将 S(一个数组)的每个元素分配给 y 数组中的一个位置。但是怎么样?

提前感谢您的帮助。

【问题讨论】:

  • 显然Sy 中的一个或两个不是 数组;根据错误消息,它是一个浮点数。
  • 如果您将 S 预先分配为一个零数组(实际上是一个零数组列表,查看代码 - 这看起来很奇怪,但可能不是问题),它怎么会变成一个漂浮?! y 参数更有可能是浮点数,但 print type(S), type(y) 会肯定地告诉你。
  • 知道了,但是 type(y) 给了我“NameError: name 'y' is not defined”。
  • ...在f?您无法在 该标识符不存在的范围内找出标识符所引用的对象的类型!

标签: python arrays scipy


【解决方案1】:

再看一下odeint 的文档。定义要求解的系统的函数的签名是func(y,t,...)。您必须将f 的定义更改为

def f(y, t):
    ...

注意yt 的顺序与odescipy.integrate 使用的顺序相反。例如,请参阅Interchanging between different scipy ode solvers

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 2012-10-15
    • 2014-01-16
    • 2017-02-27
    • 2018-01-28
    • 2014-06-10
    • 2012-10-16
    相关资源
    最近更新 更多