如何在Python中存储带标签的数值查找表

5 投票
4 回答
1802 浏览
提问于 2025-04-17 13:01

我有一个科学模型,正在用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 个回答

1

如果你想通过名字来访问结果,可以用一个嵌套的字典来代替ndarray,然后使用json模块把它保存成一个.JSON文本文件。

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,这样就可以得到该变量的完整表格。

4

你为什么不使用数据库呢?我发现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是否能解决你具体的问题,我不太确定。不过,如果你对数据密集型的科学计算感兴趣,了解一下它们会对你很有帮助。

撰写回答