如何解决pytables添加重复子类作为列
我正在创建具有严格参数的HDF5文件。它具有1个由变量列组成的表。某一时刻,列变得重复,并附加了不同的数据。显然,我不能在IsDescription类中添加循环。当前,类Segments已被添加到类Summary_data下两次。我需要打电话给segments_k 70次。最好的方法是什么?谢谢。
class Header(IsDescription):
_v_pos = 1
id = Int16Col(dflt=1,pos = 0)
timestamp = Int16Col(dflt=1,pos = 1)
class Segments(IsDescription):
segment_id = Int16Col(dflt=1,pos = 0)
segment_quality = Float32Col(dflt=1,pos = 1)
segment_length = Float32Col(dflt=1,pos = 2)
class Summary_data(IsDescription):
latency = Float32Col(dflt=1,pos = 2)
segments_k = Int16Col(dflt=1,pos = 4)
segments_k0 = Segments()
segments_k1 = Segments()
class Everything(IsDescription):
header = Header()
summary_data = Summary_data()
def write_new_file():
h5file = "results.hdf5"
with open_file(h5file,mode = "w") as f:
root = f.root
table1 = f.create_table(root,"Table1",Everything)
row = table1.row
length = [[23.5,16.3],[8,6]]
quality = [[0.9,0.7],[0.6,0.4]]
for i in range(2):
row['header/id'] = i
row['header/timestamp'] = i * 2.
row['summary_data/latency'] = 0.0
row['summary_data/segments_k'] = 0
for data in range(2):
row['summary_data/segments_k'+str(data)+'/segment_id'] = data
row['summary_data/segments_k'+str(data)+'/segment_quality'] = quality[data][i]
row['summary_data/segments_k'+str(data)+'/segment_length'] = length[data][i]
row.append()
解决方法
对不起,我没有在评论中关注您的解释。以下是 HDFView 的屏幕抓图,显示了架构/表的布局。如我所见,segments_k0{0}
和segments_k1{0}
嵌套在summary_data
下。
看看它如何显示summary_data->segments_k0{0}
。那是你要的吗? 70个嵌套列,每个嵌套列具有3个嵌套列(segment_id
,segment_quality
和segment_length
)?
或者,您是否只想将segments_k0{0}
嵌套在0
行下?
我使用该架构创建了第二个表(Table2)。请参阅下面的屏幕抓取。
请注意,segments_k0{0}
之前没有summary_data->
(它不是嵌套的)。
当您使用np.dtype()
输入描述时,这两种方法都是可能的。您可以使用字典定义dtype,并以编程方式填充字段名称和格式。第二个表更容易定义。在向您展示如何创建np.dtype()
之前,我想确定您想要哪个。
好吧,我想我理解了,并将尝试解释我是如何做到的(以及如何扩展以处理所有70个细分市场)。顺便说一句,您嵌套的字段极其复杂,远比我所见过的要复杂得多。您确定需要这么多级别的嵌套字段吗?
键正在使用np.dtype()
来定义表描述。我总是使用它们来定义我的表,而不是IsDescription
方法。 (我使用NumPy处理我的HDF5数据,因此我对模块感到满意。)在您的情况下,您需要进行dytpe,因为这是我知道用代码创建复杂表结构的唯一方法。否则,您将需要创建IsDescription
个完整的小时。 :-)
下面的代码使用3种不同的方法来创建3个表(每个表中的模式和数据应相同)。每种的解释:
- 表1 :是使用您的代码创建的。它使用
IsDescription
方法来创建3summary_data/segments_k#
个条目。 (我将segments_k2 = Segments()
添加到了class Summary_data()
)。请注意以下代码行:print (tb.description.dtype_from_descr(Everything) )
。它打印 Table1使用的Everything
描述的等效np.dtype。 我在下面的表2和表3中引用了这一点。 - 表2 描述引用了np.dtype
tb2_dt
。我复制/粘贴 这是从先前的输出中得出的。我本可以引用为变量, 但我希望您看到它以了解我对表3所做的操作。填充表的代码与表1相同。 - 表3 描述引用了np.dtype
tb3_dt
。这是事情变得棘手的地方。 np.dtype结构是复杂的:它是一个元组列表和列表元组。 dtype由seg_kn_list
和tb3_dt_list
构建。填充表的代码与表1和2相同。
要使此功能适用于70个细分市场,“所有”要做的就是更改2个range(3)
参数,这些参数创建seg_kn_tlist
并填充数据行。 (当然,您还需要提供数据。)
以下代码:
import tables as tb
import numpy as np
h5file = "SO_64449277np.h5"
with tb.open_file(h5file,mode = "w") as h5f:
length = [[23.5,16.3],[8,6],[11.0,7.7]]
quality = [[0.9,0.7],[0.6,0.4],[0.8,0.5]]
root = h5f.root
table1 = h5f.create_table(root,"Table1",Everything)
print (tb.description.dtype_from_descr(Everything) )
row = table1.row
for i in range(2):
row['header/id'] = i
row['header/timestamp'] = i * 2.
row['summary_data/latency'] = 0.0
row['summary_data/segments_k'] = 0
for data in range(3):
row['summary_data/segments_k'+str(data)+'/segment_id'] = data
row['summary_data/segments_k'+str(data)+'/segment_quality'] = quality[data][i]
row['summary_data/segments_k'+str(data)+'/segment_length'] = length[data][i]
row.append()
tb2_dt = np.dtype([('header',[('id','<i2'),('timestamp','<i2')]),('summary_data',[('latency','<f4'),('segments_k',('segments_k0',[('segment_id',('segment_quality',('segment_length','<f4')]),('segments_k1',('segments_k2',])] )
table2 = h5f.create_table(root,"Table2",tb2_dt)
row = table2.row
for i in range(2):
row['header/id'] = i
row['header/timestamp'] = i * 2.
row['summary_data/latency'] = 0.0
row['summary_data/segments_k'] = 0
for data in range(3):
row['summary_data/segments_k'+str(data)+'/segment_id'] = data
row['summary_data/segments_k'+str(data)+'/segment_quality'] = quality[data][i]
row['summary_data/segments_k'+str(data)+'/segment_length'] = length[data][i]
row.append()
# Create np.dtype() iteratively
# Start with laency and segments_k,and use a loop to add segments_k# id,quality and length
seg_kn_tlist = [('latency','<i2') ]
for cnt in range(3) :
seg_kn_tlist.append( ('segments_k'+str(cnt),'<f4')] ) )
# Finish np.dtype() definition with fileds for header,timestamp and summary_data,followed by tuple with list above
tb3_dt_list = [ ('header',seg_kn_tlist) ]
tb3_dt = np.dtype( tb3_dt_list )
table3 = h5f.create_table(root,"Table3",tb3_dt)
row = table3.row
for i in range(2):
row['header/id'] = i
row['header/timestamp'] = i * 2.
row['summary_data/latency'] = 0.0
row['summary_data/segments_k'] = 0
for data in range(3):
row['summary_data/segments_k'+str(data)+'/segment_id'] = data
row['summary_data/segments_k'+str(data)+'/segment_quality'] = quality[data][i]
row['summary_data/segments_k'+str(data)+'/segment_length'] = length[data][i]
row.append()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。