我正在做科學計算的模擬,而且我幾乎總是想要在交互式解釋器中查找輸出我的模擬。我試圖編寫類來定義模擬對象(神經人羣),我想通過在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