我正在使用参数扫描测试不同变量如何影响模型。我正在尝试从文本文件中读取参数,并将其传递给函数,在该函数中将计算模型并返回答案并输出。
例如,如果我有一个输入文件,其参数名是第一行,连续的行是我要计算的参数组合:
input.txt
param1, param2, param3, ..., paramm
0,0,1
0,0,2
0,1,1
0,1,2
0,2,1
0,2,2
1,0,1
1,0,2
1,1,1
1,1,2
1,2,1
1,2,2
我有一个计算我的模型的函数。为简单起见,我将说模型是我所有参数的总和:
def model(param1,param2,param3...,paramm):
param1=0
param2=0
param3=0
param4=0
param5=0
.
.
.
paramn=0
answer=parma1+param2+param3+param4+param5
return answer
其中将参数设置为0是初始化它们的一种方式(我现在知道它不适用于param1,param2或param3,因为它会覆盖写给它们的内容)。我包含param4和param5来表示可能还有其他参数,这些参数我不会改变,但采用一些默认值。
如何读取文件并运行所有参数组合?我应该只创建一些称为params的元组并在每次读取文件后调整值吗?还是有更好的方法?
EDIT1:
我已经编辑了问题,以添加更多在文本文件和常量中已知的参数。对于每次传递给函数的情况,我最好创建一个参数对象并编辑该对象的值。
请注意,尽管该函数在此示例中是一个求和器,但在实际程序中它将更加复杂,可能仅使用参数的子集来调用其他函数。例如
def model1(param1):
a=1
b=2
c=3
return a*param1**2+b*param1+c
def model(param1,param2,param3...,paramm):
param1=0
param2=0
param3=0
param4=0
param5=0
.
.
.
paramn=0
answer=model1(param1)+param2+param3+param4+param5
答案 0 :(得分:0)
使用with open
并使model
更容易解决问题,请使用以下代码作为完整代码:
def model(param1,param2,param3):
return param1 + param2 + param3
with open('input.txt','r') as f:
next(f)
for i in f:
print(model(*i.split(',')))
答案 1 :(得分:0)
有几种方法可以做到这一点。如果文件中的第一行不存在,则可以将该文件视为.csv文件(“ param1,param2,param3”的第一行是标题,而后几行是逗号分隔的值)这三列)。 Python已经有易于使用的模块,可以在CSV文件中读写数据。您可以here来了解它。
但是,在您的特定情况下,文件以一行数据开头,第二行后面是CSV标头,然后第三行及以后都有CSV dat。如果您最终尝试读取数值数据的每一行并将其传递给函数,则可以执行以下操作:
def find_sum(values):
return sum(values)
with open(r"C:\tmp\myfile.txt", 'r') as f:
data = f.readlines()
dataname = data[0].strip() # The first row of the file
row_names = data[1].strip().split(',') # The second row of the file
for line in data[2:]:
values = [ float(i) for i in line.strip().split(',') ]
print "My function on", values, "returns", find_sum(values)
打印输出:
My function on [0.0, 0.0, 1.0] returns 1.0
My function on [0.0, 0.0, 2.0] returns 2.0
My function on [0.0, 1.0, 1.0] returns 2.0
My function on [0.0, 1.0, 2.0] returns 3.0
My function on [0.0, 2.0, 1.0] returns 3.0
My function on [0.0, 2.0, 2.0] returns 4.0
My function on [1.0, 0.0, 1.0] returns 2.0
My function on [1.0, 0.0, 2.0] returns 3.0
My function on [1.0, 1.0, 1.0] returns 3.0
My function on [1.0, 1.0, 2.0] returns 4.0
My function on [1.0, 2.0, 1.0] returns 4.0
My function on [1.0, 2.0, 2.0] returns 5.0
仔细查看命令[ float(i) for i in line.strip().split(',') ]
,其作用是从文件中取出一行数字,最后使用.strip()
截断换行符,将内容拆分为逗号,并将内容从字符串转换为浮点数。您可以使用整数而不是浮点数,但是我不知道您的实际数据是否可能包含非数字值。如果需要使用变量,我还从文件的前两行中制作了变量。
编辑:如果正如评论者所解释的那样,readlines()
因为您有成千上万的行而无法完成工作,那么这是一种重新设计,尽管它会跳过行直到找到为止以一个假定的数字开头的是一行数据:
reached_numbers = False
with open(r"C:\tmp\myfile.txt", 'r') as f:
for line in (f):
if reached_numbers:
values = [ float(i) for i in line.strip().split(',') ]
print "My function on", values, "returns", find_sum(values)
else:
reached_numbers = line[0].isdigit()