首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python -语法建议-模拟

python -语法建议-模拟
EN

Stack Overflow用户
提问于 2017-11-02 09:16:14
回答 1查看 59关注 0票数 0

考虑下面的代码模拟,这是一个非齐次泊松过程。重点介绍了Non_hom_poisson(T,n,N)函数。

代码语言:javascript
复制
def lam_t(T): #calculates lam(t) at given t
    Lambda=[]
    t=T
    for i in range(len(T)):    
        Lambda.append(0.8+0.4*np.sin(0.2*np.pi*t[i]))
    return Lambda

def thinning(max_min,Lam_t,lam_min,times,subset_length): 
#thins max-min to lam(t)-lam_min
    t=0
    J=0
    I=0
    S=[]
    path=2
    t_J=np.arange(0,602,2)
    while (J<300):
        if (path==2):
            unif=np.random.uniform(0,1)
            X=(-1/float(max_min[J]))*np.log(unif)
            path=3
        if (path==3):
            if ((t+X)>t_J[J+1]):
                if ((J+2)>=300):
                    return S;
                X=(X-t_J[J+1]+t)*max_min[J+1]/float(max_min[J+2])
                t=t_J[J+1]
                J+=1
                path=3
            else:
                t+=(X)
                U=np.random.uniform(0,1)
                L_t=0.8+0.4*np.sin(0.2*(np.pi)*t)
                top_prob=float(L_t-lam_min[J])
                bottom_prob=float(max_min[J])
                prob=top_prob/float(bottom_prob)
                if (U<=(prob)):
                    I+=1
                    S.append(float(t))
                    path=2
        if (t>600):
            break
    return S;

def mod_lam(t,lam): 
    interval=float(np.mod(t,10))
    J=np.arange(2,12,2)
    for i in range(len(J)):
        if (interval<J[i]):
            return float(lam[i])
    return float(lam[i])

def Non_hom_poisson(T,n,N):
    time=np.arange(0.1,10.1,0.1)
    Lambda_t=lam_t(time)
    max_lam=[max(Lambda_t[x:(x+19)]) for x in range(0,len(time),20)]
    min_lam=[min(Lambda_t[x:(x+19)]) for x in range(0,len(time),20)]
    max_min_lam=[(max_lam[x]-min_lam[x]) for x in range(len(max_lam))]
    max_min_lam=np.tile(max_min_lam,60)
    min_lam=np.tile(min_lam,60)
    poisson_min=[np.random.poisson(float(min_lam[0]))]
    i=0
    while (poisson_min[i]<600):
        y=float(mod_lam(poisson_min[i],min_lam))
        x=-1/float(y)*np.log(np.random.uniform(0,1))
        poisson_min.append(float(x)+float(poisson_min[i]))
        i+=1
    thinned=thinning(max_min_lam,Lambda_t,min_lam,time,20)
    superposition=np.append(thinned,poisson_min)
    return np.sort(superposition)
NH=Non_hom_poisson(600,5,1)
print(NH)

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2017-11-03 06:32:02

该行中有三个函数调用:range()max()len()。这些都是python内置的。

但这两个标识符都不是保留字。因此,可能发生的情况是,您在全局作用域中使用了其中一个标识符作为变量名。由于在lam_t()函数中调用len()range()都没有错误,因此它必须是整数max

这意味着像这样的赋值已经在全局作用域中执行。

代码语言:javascript
复制
max = 100  

问题中包含的代码不包含任何此类赋值,但错误消息指示max指向整数。您可以在python repl中重现该错误。

代码语言:javascript
复制
>>> max = 1
>>> max(1, 3, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>> del max  # fix it
>>> max(1, 3, 2)
3

最好避免使用sumlenlistmaxmininthashdir等作为变量名。

如果你使用像jupyter笔记本这样的东西,在全局名称空间中定义大量变量,然后忘记它,这是一个令人困惑的bug的原因。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47066072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档