python - 附加到 h5 文件
问题描述
我有一个 h5 文件,其中包含这样的数据集:
col1. col2. col3
1 3 5
5 4 9
6 8 0
7 2 5
2 1 2
我有另一个具有相同列的 h5 文件:
col1. col2. col3
6 1 9
8 2 7
我想将这两个连接起来以获得以下 h5 文件:
col1. col2. col3
1 3 5
5 4 9
6 8 0
7 2 5
2 1 2
6 1 9
8 2 7
如果文件很大或者我们有很多这样的合并,那么最有效的方法是什么?
解决方案
我对熊猫不熟悉,所以无能为力。这可以通过 h5py 或 pytables 来完成。正如@hpaulj 提到的,该过程将数据集读入一个 numpy 数组,然后使用 h5py 写入一个 HDF5 数据集。确切的过程取决于 maxshape 属性(它控制是否可以调整数据集的大小)。
我创建了示例来展示这两种方法(固定大小或可调整大小的数据集)。第一种方法创建一个新的 file3,它结合了 file1 和 file2 的值。第二种方法将 file2 中的值添加到 file1e(可调整大小)。注意:创建示例中使用的文件的代码在最后。
我对 SO 有一个更长的答案,它显示了复制数据的所有方法。
看到这个答案:如何合并多个 .h5 文件?
方法一:将数据集合并到一个新文件
中,当数据集不是使用maxshape=
参数创建时需要
with h5py.File('file1.h5','r') as h5f1, \
h5py.File('file2.h5','r') as h5f2, \
h5py.File('file3.h5','w') as h5f3 :
print (h5f1['ds_1'].shape, h5f1['ds_1'].maxshape)
print (h5f2['ds_2'].shape, h5f2['ds_2'].maxshape)
arr1_a0 = h5f1['ds_1'].shape[0]
arr2_a0 = h5f2['ds_2'].shape[0]
arr3_a0 = arr1_a0 + arr2_a0
h5f3.create_dataset('ds_3', dtype=h5f1['ds_1'].dtype,
shape=(arr3_a0,3), maxshape=(None,3))
xfer_arr1 = h5f1['ds_1']
h5f3['ds_3'][0:arr1_a0, :] = xfer_arr1
xfer_arr2 = h5f2['ds_2']
h5f3['ds_3'][arr1_a0:arr3_a0, :] = xfer_arr2
print (h5f3['ds_3'].shape, h5f3['ds_3'].maxshape)
方法2:将file2数据集附加到file1数据
集file1e中的数据集必须使用maxshape=
参数创建
with h5py.File('file1e.h5','r+') as h5f1, \
h5py.File('file2.h5','r') as h5f2 :
print (h5f1['ds_1e'].shape, h5f1['ds_1e'].maxshape)
print (h5f2['ds_2'].shape, h5f2['ds_2'].maxshape)
arr1_a0 = h5f1['ds_1e'].shape[0]
arr2_a0 = h5f2['ds_2'].shape[0]
arr3_a0 = arr1_a0 + arr2_a0
h5f1['ds_1e'].resize(arr3_a0,axis=0)
xfer_arr2 = h5f2['ds_2']
h5f1['ds_1e'][arr1_a0:arr3_a0, :] = xfer_arr2
print (h5f1['ds_1e'].shape, h5f1['ds_1e'].maxshape)
创建上面使用的示例文件的代码:
import h5py
import numpy as np
arr1 = np.array([[ 1, 3, 5 ],
[ 5, 4, 9 ],
[ 6, 8, 0 ],
[ 7, 2, 5 ],
[ 2, 1, 2 ]] )
with h5py.File('file1.h5','w') as h5f:
h5f.create_dataset('ds_1',data=arr1)
print (h5f['ds_1'].maxshape)
with h5py.File('file1e.h5','w') as h5f:
h5f.create_dataset('ds_1e',data=arr1, shape=(5,3), maxshape=(None,3))
print (h5f['ds_1e'].maxshape)
arr2 = np.array([[ 6, 1, 9 ],
[ 8, 2, 7 ]] )
with h5py.File('file2.h5','w') as h5f:
h5f.create_dataset('ds_2',data=arr2)
推荐阅读
- mysql - 在 PHP7 中,清理包含文件名的 UTF8 字符的最佳方法是什么?
- d3.js - D3 百分比上标
- reactjs - 在material-ui的手风琴中禁用折叠或展开
- python - 为什么在定义项目列表时 if 语句中需要 else ?
- c# - C# 泛型方法类型参数不是从用法中推断出来的
- javascript - 调用 REST API 会出现错误 TypeError
- amazon-cognito - 如何使用身份令牌获取 aws 的临时凭证?
- c# - 使 Azure 函数在 ServiceBusTrigger 上按顺序运行 - maxConcurrentCalls 不起作用
- postgresql - 从其他表中提取结果的情况
- php - “PHP 编译选项”到底是什么意思?