如何将大型多个数组分层写入 h5 文件?
How to write large multiple arrays to a h5 file in layers?
假设我有 10000 个系统。对于每个系统,我有 2 个数据集:对于每个数据集,我都有 x、y 和 y_err 数组。如何使用 h5py
或 pandas
将所有系统的数据放入 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)
假设我有 10000 个系统。对于每个系统,我有 2 个数据集:对于每个数据集,我都有 x、y 和 y_err 数组。如何使用 h5py
或 pandas
将所有系统的数据放入 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)