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

向PyTables数组批量添加行

如何解决向PyTables数组批量添加行

我有一个脚本,可以从实验中收集数据并将其添加到PyTables表中。该脚本分批获取数据(例如,以10为一组)。通过普通方法(例如:

)一次添加一行代码有点麻烦
data_batch = experiment.read()
last_time = time.time()
for data_row in data_batch:
    row = table.row
    row['timestamp'] = last_time
    last_time += dt
    row['column1'] = data_row[0]
    row['column2'] = data_row[1]
    row.append()
table.flush()

我宁愿做这样的事情:

data_batch = experiment.read()
start_index = len(table)
num_rows = len(data_batch)

table.append_n_rows(num_rows)
table.cols.timestamp[start_index:] = last_time + np.arange(num_rows) * dt
last_time += dt * num_rows
table.cols.column1[start_index:] = data_batch[:,0]
table.cols.column2[start_index:] = data_batch[:,1]
table.flush()

有人知道table.append_n_rows是否存在某些功能。现在,我所能做的就是[table.row for i in range(num_rows)],我觉得它很笨拙且效率低下。

解决方法

您处在正确的轨道上。在table.append(rows)中,rows参数可以是可以转换为结构化数组的任何对象。其中包括:“ NumPy结构化的数组,元组或数组记录的列表以及字符串或Python缓冲区”。 (我更喜欢NumPy数组,因为我经常使用它们。您的答案显示了如何使用元组列表。)

具有显着的性能优势,即批量添加数据,而不是一次添加1行。我进行了一些测试,并于几年前发布到SO。 I / O性能主要与批次数量有关,而不与批次大小有关。请查看此答案以获取详细信息:pytables writes much faster than h5py

此外,如果要创建大表,请在创建表时考虑设置expectedrows参数。这也将提高I / O性能。这样做的好处是可以设置适当的chunksize

推荐的数据处理方法。

data_batch = experiment.read()
last_time = time.time()

row_list = []
for data_row in data_batch:
    row_list.append( (last_time,data_row[0],data_row[1] ) )
    last_time += dt

your_table.append( row_list )    
your_table.flush()
,

source code

中有一个示例

我将其粘贴到此处,以避免将来出现死链接。

import tables as tb
class Particle(tb.IsDescription):
    name        = tb.StringCol(16,pos=1) # 16-character String
    lati        = tb.IntCol(pos=2)        # integer
    longi       = tb.IntCol(pos=3)        # integer
    pressure    = tb.Float32Col(pos=4)  # float  (single-precision)
    temperature = tb.FloatCol(pos=5)    # double (double-precision)
fileh = tb.open_file('test4.h5',mode='w')
table = fileh.create_table(fileh.root,'table',Particle,"A table")
# Append several rows in only one call
table.append([("Particle:     10",10,10 * 10,10**2),("Particle:     11",11,-1,11 * 11,11**2),("Particle:     12",12,-2,12 * 12,12**2)])
fileh.close()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。