tur*_*ing 12 python python-module python-import mcmc pymc
是否可以在python中传递带有一些参数的模块?
所有我的意思是参数是模块中存在一个未在该模块中初始化的变量,我仍然在该模块中使用该变量.简而言之,我希望行为类似于函数,但与函数不同,我希望模块的变量在调用代码中公开.
例如
a.py
#lists like data, count, prob_distribution are constructed from training_pool (not initialized in this file)
x = pymc.Uniform('x', lower = 0, upper = 1)
rv = [ Multinomial("rv"+str(i), count[i], prob_distribution[i], value = data[i], observed=True) for i in xrange(0, len(count)) ]
Run Code Online (Sandbox Code Playgroud)
b.py
import a #I want some way tr pass value of training_pool
m = pymc.MCMC(a)
Run Code Online (Sandbox Code Playgroud)
我希望a.py中的所有随机变量都暴露给MCMC.我对我手头的问题采取了更好的方法,但我也想知道在python中是否可以传递模块的参数
无法将参数传递给模块。但是,您可以在第三个模块中使用全局变量:
# a.py
parameter = None
Run Code Online (Sandbox Code Playgroud)
# b.py
import a
a.parameter = 4
import c
Run Code Online (Sandbox Code Playgroud)
# c.py
import a
# use a.parameter
Run Code Online (Sandbox Code Playgroud)
当然,这只有在没有其他东西导入 c 的情况下才有效,因为模块只导入一次。
正如@otus已经回答,没有办法将参数传递给模块.
我想您正在关注PyMC2的一些介绍性示例,它们使用模式,其中模块包装贝叶斯模型中节点的所有代码.这种方法很适合入门,但是,正如您所发现的那样,当您想要运行具有各种变化的模型时,这可能会受到限制.
幸运的是,PyMC2可以从列表或字典以及模块创建MCMC对象.在这种情况下我推荐的是@ oleg-s在评论中建议的:使用函数.您可以结束该函数return locals()以获取模块中已存在的所有内容的字典,这是pymc.MCMC构造函数的合适输入.这是一个例子:
# a.py
from pymc import *
count = [10, 10] # perhaps good to put this stuff in data.py
prob_distribution = [[.5, .5], [.1, .2, .7]]
data = [[2, 8], [2, 3, 5]]
def model(training_pool):
x = Uniform('x', lower = 0, upper = 1)
rv = [ Multinomial("rv"+str(i), count[i], prob_distribution[i], value = data[i], observed=True) for i in training_pool ]
return locals()
Run Code Online (Sandbox Code Playgroud)
# b.py
import pymc, a
training_pool = [0]
m = pymc.MCMC(a.model(training_pool))
Run Code Online (Sandbox Code Playgroud)
小智 6
有多种方法可以做到这一点,这里只是一个愚蠢而简单的方法:
主文件
"""A silly example - main supplies a parameter
"""
import sys,os
print os.path.basename(__file__)+":Push it by: --myModuleParam "+str(123)
sys.argv.append('--myModuleParam')
sys.argv.append(123)
import module
print os.path.basename(__file__)+":Pushed my param:"+str(module.displayMyParam)
Run Code Online (Sandbox Code Playgroud)
模块.py
"""A silly example - module consumes parameter
"""
import sys,os
displayMyParam = 'NotYetInitialized'
for px in sys.argv:
if px == '--myModuleParam':
idx = sys.argv.index(px)
sys.argv.pop(idx) # remove option
displayMyParam = sys.argv[idx]
sys.argv.pop(idx) # remove value
print os.path.basename(__file__)+":Got my param:"+str(displayMyParam)
#
# That's it...
#
Run Code Online (Sandbox Code Playgroud)
我发现定义全局变量很有帮助,并允许通过 init 函数设置这些变量。
def init(config_filename=CONFIG_FILENAME):
config = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation())
config.read(config_filename)
global YEARS
YEARS = config['DEFAULT']['YEARS']
global FEATURES
FEATURES = config['DEFAULT']['FEATURES']
Run Code Online (Sandbox Code Playgroud)
然后用户所要做的就是记住在使用这些方法之前初始化模块:
import module
module.init('config.ini')
Run Code Online (Sandbox Code Playgroud)
请注意,我不会在我希望公开传播的模块上使用它。这更适合我个人使用的单文件模块。
| 归档时间: |
|
| 查看次数: |
13207 次 |
| 最近记录: |