如何使用HDF5文件中的1D数组执行加减等运算并处理混合字符串类型问题
你读取得到的是NumPy结构化数组,这类数组允许不同字段存储不同类型数据,不能直接按普通二维数值数组的方式切片运算,按以下步骤处理即可:
步骤1:确认字段信息
读取数据后先打印数组的dtype属性,查看所有字段的名称、类型和顺序,示例代码如下:
import numpy as np import h5py with h5py.File('xaa.h5', 'r') as hdff: dat1 = np.array(hdff['particles/lipids/positions/dataset_0001']) dat2 = np.array(hdff['particles/lipids/positions/dataset_0002']) # 打印字段信息 print(dat1.dtype)
你给出的示例数组对应的dtype输出大概为:dtype([('f0', 'S3'), ('f1', 'S3'), ('f2', '<i4'), ('f3', '<f8'), ('f4', '<f8'), ('f5', '<f8')])
其中f3、f4、f5就是你需要的三个浮点型字段,如果HDF5数据集存储时设置了自定义字段名,打印结果会显示对应的自定义名称,替换后续代码中的字段名即可。
步骤2:提取浮点数列做运算
两种常用方案可选:
方案1:转为普通二维数值数组(适合大量数值运算场景)
提取浮点字段后转为统一类型的二维数组,后续可以直接做任意数值运算:
# 提取指定浮点字段,转为shape为(行数, 3)的float64数组 float_dat1 = dat1[['f3', 'f4', 'f5']].view(np.float64).reshape(dat1.shape[0], 3) float_dat2 = dat2[['f3', 'f4', 'f5']].view(np.float64).reshape(dat2.shape[0], 3) # 直接实现第二行减第一行的运算 row_diff = float_dat1[1] - float_dat1[0] print(row_diff)
方案2:直接基于结构化数组字段运算(不需要额外转格式)
row_diff = dat1[1][['f3', 'f4', 'f5']] - dat1[0][['f3', 'f4', 'f5']] # 结果可直接转为列表或普通数组使用 print(list(row_diff))
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

