微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

pytables添加重复子类作为列

如何解决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_idsegment_qualitysegment_length)? HDFView image

或者,您是否只想将segments_k0{0}嵌套在0行下? 我使用该架构创建了第二个表(Table2)。请参阅下面的屏幕抓取。 请注意,segments_k0{0}之前没有summary_data->(它不是嵌套的)。 enter image description here

当您使用np.dtype()输入描述时,这两种方法都是可能的。您可以使用字典定义dtype,并以编程方式填充字段名称和格式。第二个表更容易定义。在向您展示如何创建np.dtype()之前,我想确定您想要哪个。

,

好吧,我想我理解了,并将尝试解释我是如何做到的(以及如何扩展以处理所有70个细分市场)。顺便说一句,您嵌套的字段极其复杂,远比我所见过的要复杂得多。您确定需要这么多级别的嵌套字段吗?

键正在使用np.dtype()来定义表描述。我总是使用它们来定义我的表,而不是IsDescription方法。 (我使用NumPy处理我的HDF5数据,因此我对模块感到满意。)在您的情况下,您需要进行dytpe,因为这是我知道用代码创建复杂表结构的唯一方法。否则,您将需要创建IsDescription个完整的小时。 :-)

下面的代码使用3种不同的方法来创建3个表(每个表中的模式和数据应相同)。每种的解释:

  1. 表1 :是使用您的代码创建的。它使用IsDescription方法来创建3 summary_data/segments_k#个条目。 (我将segments_k2 = Segments()添加到了class Summary_data())。请注意以下代码行: print (tb.description.dtype_from_descr(Everything) )。它打印 Table1使用的Everything描述的等效np.dtype。 我在下面的表2和表3中引用了这一点。
  2. 表2 描述引用了np.dtype tb2_dt。我复制/粘贴 这是从先前的输出中得出的。我本可以引用为变量, 但我希望您看到它以了解我对表3所做的操作。填充表的代码与表1相同。
  3. 表3 描述引用了np.dtype tb3_dt。这是事情变得棘手的地方。 np.dtype结构是复杂的:它是一个元组列表和列表元组。 dtype由seg_kn_listtb3_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 举报,一经查实,本站将立刻删除。