所以我需要查看一些函数f
,它取决于各种参数,汇总在我称为dict
的{{1}}中。
data
中的某些参数已修复,如data
,而其他我想改变。
我在data['focus']
,另一个temp
中写下了我想要更改的参数。我的函数dict
然后获取变化参数的所有组合并每次计算Trial
,将其结果和参数保存到f
dict
dicts
,其中每个计算都保存在calcdata
。
我在下面提供了一个最小的工作示例。
这有效,我已经可以使用它了(虽然我简化了函数calcdata[counter]
)。
但是,正如您所看到的,我仅限于3组参数。
我有没有办法让它可以在f
中接受任意数量的keys
?
基本上我想要某种自动化,这样我就不必写temp
和value0
。
理想情况下,它会读出有多少keys[0]
,并执行所需的keys
次循环。
for
答案 0 :(得分:1)
以下是您可以使用的一般想法:
from itertools import product
temp = {'integration': [1, 2], 'upper': [3, 4], 'other': [5, 6]}
keys = list(temp.keys())
data = {}
for values in product(*temp.values()):
data.update(zip(keys, values))
print(data)
(由于对键和值的单独访问,这在temp
上不是线程安全的)
答案 1 :(得分:0)
itertools.product
为您提供所需的组合。问题是您需要从结果中重建字典。在此示例中,我将temp
扩展为(key, value)
元组,可用于更新data
字典。我复制data
,这样我就不必担心每个循环上的陈旧数据了。
我将这个作为一个可运行的python 2脚本,带有额外的打印以显示中间步骤。
import numpy as np
import itertools
def f(data, t):
x = data['focus']*data['integration']*data['upper']
return t*x
def Trial(t, temp, data):
calcdata = {}
# make list of (key:value) pairs for each value list
temp_vector = [[(key, value) for value in valuelist]
for key,valuelist in temp.iteritems()]
print "temp_vector"
for item in temp_vector:
print item
print "-------------------------------"
# run for all combinations
for counter, subs in enumerate(itertools.product(*temp_vector)):
mydata = data.copy()
mydata.update(subs)
print "dict for calcuation:", mydata
x_axis, y_axis = np.vstack((t,np.vectorize(f)(mydata,t)))
mydata['xaxis'] = x_axis
mydata['yaxis'] = y_axis
calcdata[counter] = mydata
print "--------------------------------"
return calcdata
#data['focus'] = 100
data = {'focus':100}
t = np.linspace(1,10,10)
temp = {'integration': [1,2], 'upper': [3,4], 'other': [5,6]}
calcdata = Trial(t, temp, data)
for item in sorted(calcdata.items()):
print(item)