如何在h5文件中分层写入大的多个数组? [英] How to write large multiple arrays to a h5 file in layers?

查看:0
本文介绍了如何在h5文件中分层写入大的多个数组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有10000个系统。对于每个系统,我都有两个数据集:对于每个数据集,我都有x、y和y_err数组。如何使用h5pypandas将所有系统的数据放到一个h5文件中?下面给出了详细说明。

Systems=np.arange(10000)

for sys in Systems:
    x1,y1,y1_err=np.random.rand(100),np.random.rand(100),np.random.rand(100)
    x2,y2,y2_err=np.random.rand(200),np.random.rand(200),np.random.rand(200)

我想以结构化方式将所有系统的x1,y1,y1_err,x2,y2,y2_err放入一个h5文件。

抱歉,这可能是非常基本的任务,但我真的很努力。

HDF5

创建推荐答案文件的另外两种方法是h5py和PyTables包。它们是相似的,但都有独特的优势。两者我都喜欢的地方是:当您使用HDFView打开HDF5文件时,您可以在简单的表格布局(如电子表格)中查看数据。

我为每个人都写了一个例子。只有2个函数不同:1)使用create_group()创建组和使用h5pycreate_dataset创建数据集与使用PyTablescreate_table创建数据集。两者都使用数字重数组来命名数据列(也称为x1,y1,y1_err)。如果您不想给列命名,并且所有数据都是同一类型(例如,全部为浮点型或全部为整型),则该过程会稍微简单一些。

h5py的流程如下:

import h5py
import numpy as np

table1_dt = np.dtype([('x1',float), ('y1',float), ('y1_err',float),])
table2_dt = np.dtype([('x2',float), ('y2',float), ('y2_err',float),])

Systems=np.arange(10_000)

with h5py.File('SO_71335363.h5','w') as h5f:
    
    for sys in Systems:
        grp = h5f.create_group(f'System_{sys:05}')
        x1,y1,y1_err=np.random.rand(100),np.random.rand(100),np.random.rand(100)
        t1_arr = np.empty(dtype=table1_dt,shape=(x1.shape[0],))
        t1_arr['x1'] = x1
        t1_arr['y1'] = y1
        t1_arr['y1_err'] = y1_err       
        grp.create_dataset('table1',data=t1_arr)
        
        x2,y2,y2_err=np.random.rand(200),np.random.rand(200),np.random.rand(200)
        t2_arr = np.empty(dtype=table2_dt,shape=(x2.shape[0],))
        t2_arr['x2'] = x2
        t2_arr['y2'] = y2
        t2_arr['y2_err'] = y2_err       
        grp.create_dataset('table2',data=t2_arr)

以下是与PyTables相同的过程(Package isimport tables):

import tables as tb # (this is PyTables)
import numpy as np

table1_dt = np.dtype([('x1',float), ('y1',float), ('y1_err',float),])
table2_dt = np.dtype([('x2',float), ('y2',float), ('y2_err',float),])

Systems=np.arange(10_000)

with tb.File('SO_71335363_tb.h5','w') as h5f:
    
    for sys in Systems:
        grp = h5f.create_group('/',f'System_{sys:05}')
        x1,y1,y1_err=np.random.rand(100),np.random.rand(100),np.random.rand(100)
        t1_arr = np.empty(dtype=table1_dt,shape=(x1.shape[0],))
        t1_arr['x1'] = x1
        t1_arr['y1'] = y1
        t1_arr['y1_err'] = y1_err       
        h5f.create_table(grp,'table1',obj=t1_arr)
        
        x2,y2,y2_err=np.random.rand(200),np.random.rand(200),np.random.rand(200)
        t2_arr = np.empty(dtype=table2_dt,shape=(x2.shape[0],))
        t2_arr['x2'] = x2
        t2_arr['y2'] = y2
        t2_arr['y2_err'] = y2_err       
        h5f.create_table(grp,'table2',obj=t2_arr)

这篇关于如何在h5文件中分层写入大的多个数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆