如何用h5py将标量属性保存为shape=(1,)的数组?
解决h5py创建大小为1的数组属性而非标量的问题
要让h5py创建的属性是大小为1的数组而非标量,核心是调用attrs.create()时显式指定shape=(1,),同时把属性值包装成数组形式(列表或numpy数组均可),具体操作如下:
修改后的代码示例
import h5py import numpy as np # 处理数值类型更便捷,也可以不用直接用列表 if __name__ == '__main__': with h5py.File('tmp.h5', 'w') as out_file: # 用with语句自动管理文件关闭,更安全 data = [0, 1, 2, 3, 4] attributes = {'sample': 1, 'option': 'tmp'} out_file.create_dataset('tmp_dataset', data=data) for attr_key, attr_value in attributes.items(): # 把单个值包装成数组/列表形式 if isinstance(attr_value, str): attr_array = [attr_value] else: attr_array = np.array([attr_value]) # 显式指定shape为(1,),强制生成大小为1的数组属性 out_file['tmp_dataset'].attrs.create(attr_key, attr_array, shape=(1,))
关键说明
- shape参数的作用:h5py默认会根据输入值的形态判断是标量还是数组,显式设置
shape=(1,)能强制让属性成为一维数组(长度为1)。 - 值的包装要求:必须把单个值转换成数组/列表形式,否则即使指定shape,h5py仍可能将其识别为标量。比如把
1改成[1],把'tmp'改成['tmp']。 - dtype无效的原因:dtype仅定义数据类型(如int、float、str),不改变数据的形状——标量和大小为1的数组可以是同一数据类型,所以必须通过shape参数控制形态。
用HDFView打开生成的tmp.h5,就能看到所有属性都是大小为1的数组类型,符合目标程序的读取要求。
内容的提问来源于stack exchange,提问作者Lars Kakavandi-Nielsen
相关产品推荐
相关产品推荐

