如何在Python中存储数字查找表(带标签)

时间:2012-02-14 16:27:49

标签: python numpy

我有一个科学模型,我在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 个答案:

答案 0 :(得分: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是否是您特定问题的答案,我不知道。但是,如果您正在进行数据密集型科学计算,那么您可以从检查中获益。

答案 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