如何将大型多个数组分层写入 h5 文件?

How to write large multiple arrays to a h5 file in layers?

假设我有 10000 个系统。对于每个系统,我有 2 个数据集:对于每个数据集,我都有 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 文件中。

抱歉,这可能是非常初级的任务,但我真的很挣扎。

我认为这应该可行:

df = pd.DataFrame(columns=['system','x1','y1','y1_err','x2','y2','y2_err'])

Systems=np.arange(10000)

for i, sys in enumerate(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)
    temp = (pd.DataFrame([x1,y1,y1_err,x2,y2,y2_err], index=['x1','y1','y1_err','x2','y2','y2_err'])).transpose()
    temp["system"] = i
    df = pd.concat([df, temp])

df.to_hdf('data.h5', key='key')

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

我分别写了一个例子。只有 2 个函数不同:1) 使用 create_group() 创建组并使用 h5py create_dataset 创建数据集与 PyTables create_table。两者都使用 numpy recarray 来命名数据列(又名 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 相同的过程(包是 import 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)