我正在做科学计算的模拟,而且我几乎总是想要在交互式解释器中查找输出我的模拟。我试图编写类来定义模拟对象(神经人群),我想通过在ipython中调用脚本%run test_class_WC.py
来正式确定我对这些类的测试。由于包含该类的模块/文件在我尝试调试/添加功能时发生了变化,因此我每次都要重新加载它。python:import numpy as np from external code gets in my own user defined module
./test_class_WC.py:
import WC_class # make sure WC_class exists
reload(WC_class) # make sure it's the most current version
import numpy as np
from WC_class import WC_unit # put the class into my global namespace?
E1 = WC_unit(Iapp=100)
E1.update() # see if it works
print E1.r
所以马上我使用重载使蝙蝠肯定我明白了加载模块的最新版本,所以我有最新鲜的类definition--我敢肯定,这是笨重赫克(也许更险恶?),但它节省了我做%run WC_class.py
和不得不做一个单独的呼叫%run test_WC.py
和./WC_class一些麻烦:
class WC_unit:
nUnits = 0
def __init__(self,**kwargs):
self.__dict__.update(dict( # a bunch of params
gee = .6, # i need to be able to change
ke=.1,the=.2, # in test_class_WC.py
tau=100.,dt=.1,r=0.,Iapp=1.), **kwargs)
WC_unit.nUnits +=1
def update(self):
def f(x,k=self.ke,th=self.the): # a function i define inside a method
return 1/(1+np.exp(-(x-th)/k)) # using some of those params
x = self.Iapp + self.gee * self.r
self.r += self.dt/self.tau * (-self.r + f(x))
WC_unit基本上定义了一堆默认参数,并定义了使用基本欧拉积分进行更新的ODE。我希望test_class_WC建立含有NP一个全局命名空间(和WC_unit和WC_class)
当我运行它,我得到以下错误:
In [14]: %run test_class_WC.py
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/Users/steeles/Desktop/science/WC_sequence/test_class_WC.py in <module>()
8
9 E1 = WC_unit(Iapp=100)
---> 10 E1.update()
11
12 # if bPlot:
/Users/steeles/Desktop/science/WC_sequence/WC_class.py in update(self)
19 return 1/(1+np.exp(-(x-th)/k))
20 x = self.Iapp + self.gee * self.r
---> 21 self.r += self.dt/self.tau * (-self.r + f(x))
22
23 # @class_method
/Users/steeles/Desktop/science/WC_sequence/WC_class.py in f(x, k, th)
17 def update(self):
18 def f(x,k=self.ke,th=self.the):
---> 19 return 1/(1+np.exp(-(x-th)/k))
20 x = self.Iapp + self.gee * self.r
21 self.r += self.dt/self.tau * (-self.r + f(x))
NameError: global name 'np' is not defined
现在我可以只导入numpy的解决这个问题作为np在WC_class模块的顶部,或者甚至在test_class_WC中执行from numpy import exp
,并将update()方法更改为包含exp()而不是np.exp()...但我没有试图这样做,因为它很容易,我想了解所有这些命名空间/模块的东西如何工作,所以我不再是一个蟒蛇白痴。为什么np在WC_unit命名空间中迷路了?是因为我正在处理两个不同的文件/模块?在函数内调用np.exp
是否与它有关?
对于改进我的工作流程和文件结构,我也很乐于提供建议,因为它似乎不是特别pythonic。如果这有助于任何人理解,我的背景是在MATLAB中。我正在编辑SublimeText2中的.py文件。抱歉,代码不是非常小,我一直在很难再现问题。
您需要在'WC_class.py'的顶部将'numpy导入为np' – 2015-02-11 02:15:52