2012-02-14 9 views
5

Tengo un modelo científico que estoy ejecutando en Python que produce una tabla de búsqueda como salida. Es decir, produce una "tabla" multidimensional donde cada dimensión es un parámetro en el modelo y el valor en cada celda es el resultado del modelo.Cómo almacenar tabla de búsqueda numérica en Python (con etiquetas)

Mi pregunta es la mejor manera de almacenar esta tabla de búsqueda en Python. Estoy ejecutando el modelo en un bucle sobre cada combinación de parámetros posible (utilizando la fantástica función itertools.product), pero no puedo encontrar la mejor manera de almacenar las salidas.

Parece sensato simplemente almacenar la salida como ndarray, pero me gustaría poder acceder a las salidas en función de los valores de los parámetros y no solo de los índices. Por ejemplo, en lugar de acceder a los valores como table[16][5][17][14] yo preferiría tener acceso a ellos de alguna manera el uso de nombres/valores de las variables, por ejemplo:

table[solar_z=45, solar_a=170, type=17, reflectance=0.37]

o algo similar a eso. Sería genial si pudiera iterar sobre los valores y recuperar sus valores de parámetros, es decir, ser capaz de descubrir que table[16]... corresponde a las salidas para solar_z = 45.

¿Hay alguna manera sensata de hacer esto en Python?

+2

Mira la página [pandas] (http://pandas.pydata.org/). – DSM

+2

O tal vez [PyTables] (http://www.pytables.org/). –

Respuesta

1

Si desea acceder a los resultados por su nombre, puede usar un diccionario anidado de Python en lugar de ndarray, y serializarlo en un archivo de texto .JSON utilizando el módulo json.

+1

Un diccionario anidado no le daría la capacidad de recuperar los valores mediante el uso de los parámetros (nombre, valor) – jsbueno

1

Una opción es usar un ndarray numpy para los datos (como lo hace ahora), y escribir una función de analizador para convertir los valores de la consulta en índices de fila/columna.

Por ejemplo:

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], ...] 

También podría convertir a la cadena y eval, si usted quiere tener algunos de los campos que debe darse como "Ninguno" y traducirse a ":" (para dar la tabla completa para esa variable).

4

¿Por qué no utiliza una base de datos? He encontrado MongoDB (y el controlador oficial de Python, Pymongo) para ser una herramienta maravillosa para la informática científica. Aquí hay algunas ventajas:

  • Fácil de instalar: simplemente descargue los archivos ejecutables para su plataforma (2 minutos como máximo, en serio).
  • sin esquema modelo de datos
  • ardiendo rápido
  • Proporciona mapa/reducir la funcionalidad
  • muy buenas funcionalidades Consulta de

Por lo tanto, se podría almacenar cada entrada como una entrada MongoDB, por ejemplo:

{"_id":"run_unique_identifier", 
"param1":"val1", 
"param2":"val2" # etcetera 
} 

Posteriormente, se podría consultar las entradas como usted:

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 

Ya sea que MongoDB/pymongo sea o no la respuesta a su pregunta específica, no lo sé. Sin embargo, realmente podría beneficiarse si los examina si tiene una informática científica con uso intensivo de datos.

+1

Incluso si no funciona, esto es extremadamente genial. –

1

Por ejemplo, en lugar de acceder a los valores como tabla [16] [5] [17] [14] yo preferiría tener acceso a ellos de alguna manera el uso de nombres de variables/valores

Eso es lo numpy 's dtype s son para:

dt = [('L','float64'),('T','float64'),('NMSF','float64'),('err','float64')] 
    data = plb.loadtxt(argv[1],dtype=dt) 

Ahora puede acceder a los elementos de data usando date['T']['L']['NMSF']

Más información sobre dtypes: http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html

Cuestiones relacionadas