Estoy usando PyTables 2.2.1 w/Python 2.6, y me gustaría crear una tabla que contenga matrices anidadas de longitud variable.En PyTables, ¿cómo crear una matriz anidada de longitud variable?
He buscado la documentación de PyTables, y el ejemplo tutorial (PyTables Tutorial 3.8) muestra cómo crear una matriz anidada de longitud = 1. Pero para este ejemplo, ¿cómo agregaría un número variable de filas a los datos 'info2/info3/x 'e' info2/info3/y '?
Por tal vez una estructura de tabla para entender más fácil, aquí está mi ejemplo de cosecha propia:
"""Desired Pytable output:
DIEM TEMPUS Temperature Data
5 0 100 Category1 <--||--> Category2
x <--| |--> y z <--|
0 0 0
2 1 1
4 1.33 2.67
6 1.5 4.5
8 1.6 6.4
5 1 99
2 2 0
4 2 2
6 2 4
8 2 6
5 2 96
4 4 0
6 3 3
8 2.67 5.33
Note that nested arrays have variable length.
"""
import tables as ts
tableDef = {'DIEM': ts.Int32Col(pos=0),
'TEMPUS': ts.Int32Col(pos=1),
'Temperature' : ts.Float32Col(pos=2),
'Data':
{'Category1':
{
'x': ts.Float32Col(),
'y': ts.Float32Col()
},
'Category2':
{
'z': ts.Float32Col(),
}
}
}
# create output file
fpath = 'TestDb.h5'
fh = ts.openFile(fpath, 'w')
# define my table
tableName = 'MyData'
fh.createTable('/', tableName, tableDef)
tablePath = '/'+tableName
table = fh.getNode(tablePath)
# get row iterator
row = table.row
for i in xrange(3):
print '\ni=', i
# calc some fake data
row['DIEM'] = 5
row['TEMPUS'] = i
row['Temperature'] = 100-i**2
for j in xrange(5-i):
# Note that nested array has variable number of rows
print 'j=', j,
# calc some fake nested data
val1 = 2.0*(i+j)
val2 = val1/(j+1.0)
val3 = val1 - val2
''' Magic happens here...
How do I write 'j' rows of data to the elements of
Category1 and/or Category2?
In bastardized pseudo-code, I want to do:
row['Data/Category1/x'][j] = val1
row['Data/Category1/y'][j] = val2
row['Data/Category2/z'][j] = val3
'''
row.append()
table.flush()
fh.close()
no he encontrado ninguna indicación en los documentos PyTables que tal estructura no es posible ... pero en tal caso una la estructura de hecho no es posible, ¿cuáles son mis alternativas a las columnas anidadas de longitud variable?
- EArray? VLArray? De ser así, ¿cómo integrar estos tipos de datos en la estructura descrita anteriormente?
- alguna otra idea?
¡Cualquier ayuda es muy apreciada!
EDITAR w/Información adicional: Parece que los gurús PyTables ya han abordado la "es una estructura de este tipo es posible" pregunta: ¿
PyTables Mail Forum - Hierachical Datasets
Así que alguien ha encontrado una manera de crear un análogo Estructura de datos PyTable?
¡Gracias nuevamente!
Gracias por las sugerencias! Además, el enlace de la lista de correo tiene otros interesantes "pepitas" de sabiduría de Francesc. Al final, como me preocupaba la velocidad y el mantenimiento de la simplicidad, opté por el tamaño de matriz fijo con espacio adicional acolchado. – plmcw