Python 2.7 将变量传递到单独的文件,然后将其设置为;“全球”;

Python 2.7 将变量传递到单独的文件,然后将其设置为;“全球”;,python-2.7,Python 2.7,我注意到以下问题是相关的: 它创建一个猜测参数数组,并规定哪些参数保持不变。然后它生成要调用的正确名称,然后使用包装器来调用它。它可以工作,但我想将我的定义放在一个名为utilites.py的单独文件中,然后从初始文件调用定义。如您所见,wrapper()需要找到wrapperName()。是否有某种方法将包装器名称传递给单独的文件,然后让utilities.py中的所有定义都可以访问它?如果试图传递包装器,则会断开一个额外的参数curve_fit() 将numpy导入为np 从numpy导入随

我注意到以下问题是相关的:

它创建一个猜测参数数组,并规定哪些参数保持不变。然后它生成要调用的正确名称,然后使用包装器来调用它。它可以工作,但我想将我的定义放在一个名为utilites.py的单独文件中,然后从初始文件调用定义。如您所见,wrapper()需要找到wrapperName()。是否有某种方法将包装器名称传递给单独的文件,然后让utilities.py中的所有定义都可以访问它?如果试图传递包装器,则会断开一个额外的参数curve_fit()

将numpy导入为np
从numpy导入随机
将scipy作为sp导入
从scipy.optimize导入曲线\u拟合
将matplotlib.pyplot作为pl导入
def exp1(t、a1、tau1):
val=0。
val=(a1*np.exp(-t/tau1))*np.heaviside(t,0)
返回值
def exp2(t、a1、tau1、a2、tau2):
val=0。
val=(a1*np.exp(-t/tau1)+a2*np.exp(-t/tau2))*np.heaviside(t,0)
返回值
def exp3(t、a1、tau1、a2、tau2、a3、tau3):
val=0。
val=(a1*np.exp(-t/tau1)+a2*np.exp(-t/tau2)+a3*np.exp(-t/tau3))*np.heaviside(t,0)
返回值
def exp4(t、a1、tau1、a2、tau2、a3、tau3、a4、tau4):
val=0。
val=(a1*np.exp(-t/tau1)+a2*np.exp(-t/tau2)+a3*np.exp(-t/tau3)+a3*np.exp(-t/tau3))*np.heaviside(t,0)
返回值
def multiexp(t,args):
val=np.零(len(t))
对于np.arange中的i(0,len(args),2):
val+=args[i]*np.exp(-t/args[i+1])*np.heaviside(t,0)
返回值
def genWrapperName(保留,p0):
计数器=0
如果len(p0)==2:
wrapperName='exp1(t,'
elif len(p0)=4:
wrapperName='exp2(t,'
elif len(p0)=6:
wrapperName='exp3(t,'
elif len(p0)=8:
wrapperName='exp4(t,'
对于范围(0,len(hold))中的i:
如果保持[i]:
wrapperName+=str(p0[i])
其他:
如果i%2==0:
包装器名称+='args['+str(计数器)+']'
计数器+=1
其他:
包装器名称+='args['+str(计数器)+']'
计数器+=1
如果我在holdCurveFit.py中

import numpy as np
import utilities as ut
from numpy import random
import scipy as sp
from scipy.optimize import curve_fit
import matplotlib.pyplot as pl

p0=np.array([1.5,200.,2.,700.,3.,2400.])
hold=[0,1,0,1,0,0]
holdloc=[i for i, x in enumerate(hold) if x]
p1=np.delete(p0,holdloc)
timepoints = np.arange(-200.,4000.,20.)
callFitName= ut.genCallFitName(p0,hold)

y=ut.multiexp(timepoints,p0)+np.random.normal(0, .1, size=len(timepoints))

popt, pcov = curve_fit(ut.multiexp2, timepoints, y, p0=p0)
print 'unheld parameters:', popt

popt, pcov=eval(callFitName)
for i in range(0, len(hold)):
    if hold[i]:
        popt=np.insert(popt,i,p0[i])
print 'held parameters:', popt

yfit=ut.multiexp(timepoints,popt)

pl.plot(timepoints,y,timepoints,yfit)
pl.show()
在utilities.py中

import numpy as np

def multiexp2(t,*args):
    val=np.zeros(len(t))
    for i in np.arange(0,len(args),2):
        val+=args[i]*np.exp(-t/args[i+1])*np.heaviside(t,0)
    return val

def multiexp(t,args):
    val=np.zeros(len(t))
    for i in np.arange(0,len(args),2):
        val+=args[i]*np.exp(-t/args[i+1])*np.heaviside(t,0)
    return val

def genCallFitName(p0,hold):
    counter=0
    callFitName='curve_fit(lambda timepoints, *p: ('
    for i in range(0, len(hold)):
        if hold[i] and i%2==0:
            callFitName+=str(p0[i])
        elif hold[i] and i%2==1:
            callFitName+='*np.exp(-timepoints/'+str(p0[i])+')'
        elif i%2==0 and not hold[i]: 
            callFitName+='p['+str(counter)+']'
            counter+=1
        else:
            callFitName+='*np.exp(-timepoints/p['+str(counter)+'])'
            counter+=1
        if i<len(hold)-1 and i%2==1:
            callFitName+='+'
    callFitName+=')*np.heaviside(timepoints,0), timepoints, y, p0=p1)'
    return callFitName
将numpy导入为np
def multiexp2(t,*args):
val=np.零(len(t))
对于np.arange中的i(0,len(args),2):
val+=args[i]*np.exp(-t/args[i+1])*np.heaviside(t,0)
返回值
def multiexp(t,args):
val=np.零(len(t))
对于np.arange中的i(0,len(args),2):
val+=args[i]*np.exp(-t/args[i+1])*np.heaviside(t,0)
返回值
def genCallFitName(p0,保留):
计数器=0
callFitName='curve_fit(λ时间点,*p:('
对于范围(0,len(hold))中的i:
如果保持[i]和i%2==0:
callFitName+=str(p0[i])
elif hold[i]和i%2==1:
callFitName+='*np.exp(-timepoints/'+str(p0[i])+')
如果i%2==0且未保留[i]:
callFitName+='p['+str(计数器)+']'
计数器+=1
其他:
callFitName+='*np.exp(-timepoints/p['+str(计数器)+'])”
计数器+=1

如果有很多代码。你有简单的东西来演示这个问题吗?你在utilities.py中放了一些东西…你可以对共享函数使用相同的技巧。事实上,utilities.py似乎是一个不错的选择。
import numpy as np

def multiexp2(t,*args):
    val=np.zeros(len(t))
    for i in np.arange(0,len(args),2):
        val+=args[i]*np.exp(-t/args[i+1])*np.heaviside(t,0)
    return val

def multiexp(t,args):
    val=np.zeros(len(t))
    for i in np.arange(0,len(args),2):
        val+=args[i]*np.exp(-t/args[i+1])*np.heaviside(t,0)
    return val

def genCallFitName(p0,hold):
    counter=0
    callFitName='curve_fit(lambda timepoints, *p: ('
    for i in range(0, len(hold)):
        if hold[i] and i%2==0:
            callFitName+=str(p0[i])
        elif hold[i] and i%2==1:
            callFitName+='*np.exp(-timepoints/'+str(p0[i])+')'
        elif i%2==0 and not hold[i]: 
            callFitName+='p['+str(counter)+']'
            counter+=1
        else:
            callFitName+='*np.exp(-timepoints/p['+str(counter)+'])'
            counter+=1
        if i<len(hold)-1 and i%2==1:
            callFitName+='+'
    callFitName+=')*np.heaviside(timepoints,0), timepoints, y, p0=p1)'
    return callFitName