我有一个科学模型,我在Python中运行,它产生一个查找表作为输出。也就是说,它会生成一个多维的“表格”,其中每个维度都是模型中的参数,每个单元格中的值是模型的输出。
我的问题是如何最好地在Python中存储此查找表。我在每个可能的参数组合的循环中运行模型(使用奇妙的itertools.product
函数),但我无法确定如何最好地存储输出。
将输出简单地存储为ndarray
似乎是明智的,但我真的希望能够根据参数值而不仅仅是索引来访问输出。例如,不是以table[16][5][17][14]
的形式访问值,而是希望以某种方式使用变量名称/值来访问它们,例如:
table[solar_z=45, solar_a=170, type=17, reflectance=0.37]
或类似的东西。如果我能够迭代这些值并获得它们的参数值,那就很棒了 - 也就是说,能够发现table[16]...
对应于solar_z = 45的输出。
在Python中有一种明智的方法吗?
答案 0 :(得分:4)
为什么不使用数据库?我发现MongoDB(以及官方Python驱动程序,Pymongo)是一个很好的科学计算工具。以下是一些优点:
因此,您可以将每个条目存储为MongoDB条目,例如:
{"_id":"run_unique_identifier",
"param1":"val1",
"param2":"val2" # etcetera
}
然后您可以按照以下方式查询条目:
import pymongo
data = pymongo.Connection("localhost", 27017)["mydb"]["mycollection"]
for entry in data.find(): # this will yield all results
yield entry["param1"] # do something with param1
MongoDB / pymongo是否是您特定问题的答案,我不知道。但是,如果您正在进行数据密集型科学计算,那么您可以从检查中获益。
答案 1 :(得分:1)
如果要按名称访问结果,则可以使用python嵌套字典而不是ndarray,并使用json
模块将其序列化为.JSON文本文件。
答案 2 :(得分:1)
一种选择是对数据使用numpy ndarray(就像你现在一样),并编写一个解析器函数将查询值转换为行/列索引。
例如:
solar_z_dict = {...}
solar_a_dict = {...}
...
def lookup(dataArray, solar_z, solar_a, type, reflectance):
return dataArray[solar_z_dict[solar_z] ], solar_a_dict[solar_a], ...]
如果您希望将某些字段设置为“None”并转换为“:”(以提供该变量的完整表格),您也可以转换为字符串和eval。
答案 3 :(得分:1)
例如,而不是像表[16] [5] [17] [14]那样访问值 我更喜欢使用变量名称/值
以某种方式访问它们
这就是numpy
dtype
的用途:
dt = [('L','float64'),('T','float64'),('NMSF','float64'),('err','float64')]
data = plb.loadtxt(argv[1],dtype=dt)
现在,您可以使用data
date['T']['L']['NMSF']
个元素
有关dtypes的更多信息: http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html