我使用PyTables 2.2.1 w/Python 2.6,我想創建一個包含可變長度嵌套數組的表。在PyTables中,如何創建可變長度的嵌套數組?
我已經搜索了PyTables文檔,教程示例(PyTables Tutorial 3.8)顯示瞭如何創建一個長度= 1的嵌套數組。但是對於這個示例,我將如何向數據'info2/info3添加可變數量的行/ x'和'info2/info3/y'?
對於也許是一個更容易理解的表結構,這是我土生土長的例子:
"""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()
我還沒有發現在PyTables文檔,這樣的結構是不可能的任何跡象...但在這種情況下,一個結構實際上是不可能的,我可以選擇變長嵌套列嗎?
- EArray? VLArray?如果是這樣,如何將這些數據類型集成到上述結構中?
- 其他一些想法?
任何援助非常感謝!
編輯瓦特/附加信息: 看來,PyTables大師們已經解決了「是這樣的結構可能」的問題:
PyTables Mail Forum - Hierachical Datasets
所以有沒有人想出一個辦法來創建一個類似的PyTable數據結構?
再次感謝!
感謝您的建議!此外,郵件列表鏈接還有來自Francesc的其他一些有趣的'掘金'智慧。最後,因爲我關心速度和維護簡單性,所以我選擇了具有填充額外空間的固定數組大小。 – plmcw 2011-07-05 16:35:31