如何在Python中存储带标签的数值查找表
我有一个科学模型,正在用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中有没有什么好的方法可以做到这一点呢?
4 个回答
如果你想通过名字来访问结果,可以用一个嵌套的字典来代替ndarray,然后使用json
模块把它保存成一个.JSON文本文件。
一种选择是继续使用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,这样就可以得到该变量的完整表格。
你为什么不使用数据库呢?我发现MongoDB(还有官方的Python驱动Pymongo)是进行科学计算的一个很棒的工具。这里有一些优点:
- 安装简单 - 只需下载适合你系统的安装包(最多2分钟,真的很快)。
- 没有固定的数据结构
- 速度非常快
- 提供了地图/减少功能
- 查询功能非常好
举个例子,你可以把每一条记录存储为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是否能解决你具体的问题,我不太确定。不过,如果你对数据密集型的科学计算感兴趣,了解一下它们会对你很有帮助。