PyTable 表拆分

Posted

技术标签:

【中文标题】PyTable 表拆分【英文标题】:PyTable table split 【发布时间】:2021-12-29 00:22:23 【问题描述】:

我有一个如下格式的 PyTable 表:

/neg/data.cols (Cols), 5 columns
  data (Column(8909, 256, 256), ('<f4', (256, 256)))
  filename (Column(8909,), |S100)
  id (Column(8909,), uint32)
  label (Column(8909,), uint8)
  offset (Column(8909,), float64)

表格中有8909条数据和对应的标签。我想将此表拆分为机器学习的训练测试。假设将 80% 的行作为训练数据,20% 作为测试。

有什么实用功能可以帮助我做到这一点吗?

【问题讨论】:

【参考方案1】:

将表拆分为训练数据集和测试数据集后,您想要的数据对象是什么?每组 1 个 NumPy 数组?还是 4 个数组:train_data、train_labels、test_data、test_labels? (或别的什么?)。

如果您使用的是 Keras,*** 上还有其他一些与加载批处理相关的答案。他们可能会有所帮助。我分享链接作为参考。阅读下面的答案,您想自己编写代码。

对于 Keras 批量加载:Keras: load images batch wise for large dataset 和 How to split dataset into K-fold without loading the whole dataset at once? 如果这没有帮助,请谷歌“keras fit_generator”获取一些教程。您需要编写一个 Python 生成器函数来从 H5 文件中读取和加载图像数组。

我的回答: 通常,您希望从表中读取随机行。下面的代码显示了如何使用 Table.read_coordinates() 函数来做到这一点。这是一个独立的示例,它创建一个与您的数据模式(相同的组和数据集布局)匹配的示例 HDF5 文件。它在创建数据后关闭文件,然后打开“只读”以访问数据。

读取过程首先创建 2 个随机且唯一的行号列表(test_listtrain_list),然后使用它们将行数据读取到如上所述的各种数组中。 “只读”部分应该“按原样”处理您的数据(只需更改文件名)。获得数组后,您可以传递它们来训练和测试您的模型。

import tables as tb
import numpy as np
import random

nrows = 8000
size = 100
ds_dt = np.dtype( [ ('data',(float,(size,size))), ('filename','S100'),
                 ('id',int), ('label',int), ('offset',float) ] )

# Create sample data for use below    
with tb.File('SO_70014301.h5','w') as h5f:
    data_table = h5f.create_table('/neg','data',description=ds_dt,createparents=True)
    for cnt in range(nrows):
        arr = np.random.random(size*size).reshape(size,size)
        data_list = [ (arr, str(f'filename_cnt+1:003.jpg'), cnt+1, cnt+1001, 10.*cnt), ] 
        data_table.append(data_list)

# read sample data and extract Table: '/neg/data' aka file.root.neg.data
with tb.File('SO_70014301.h5','r') as h5f:
    data_table = h5f.root.neg.data
    nrows = data_table.nrows
    #create lists with row ids to extract test and training data
    row_list = list(range(nrows))
    test_list = sorted(random.sample(row_list, k=int(0.20*nrows)))
    train_list = list(set(row_list) - set(test_list))
    print(len(row_list),len(test_list),len(train_list))   

    #extract entire training dataset to np.recarray
    train_arr = data_table.read_coordinates(train_list)
    print(train_arr.shape)
    print(train_arr.dtype)

    #extract entire test dataset to np.recarray
    test_arr = data_table.read_coordinates(test_list)
    print(test_arr.shape)
    print(test_arr.dtype)
    
    # extract training data to array
    train_data = data_table.read_coordinates(train_list,field='data')
    # extract training labels to array
    train_labs = data_table.read_coordinates(train_list,field='label')
    print(train_data.shape, train_data.dtype)
    print(train_labs.shape, train_labs.dtype)
    
    # extract test data to array
    test_data = data_table.read_coordinates(test_list,field='data')
    # extract test labels to array
    test_labs = data_table.read_coordinates(test_list,field='label')
    print(test_data.shape, test_data.dtype)
    print(test_labs.shape, test_labs.dtype)

【讨论】:

以上是关于PyTable 表拆分的主要内容,如果未能解决你的问题,请参考以下文章

数据库表的水平拆分和垂直拆分

如何拆分excel 多个工作表

根据表 B 的拆分百分比雪花拆分表 A 的整数列

Entity Framework表拆分

HBase 表拆分

OGG,大表拆分