为NumPy数组分配名称与格式时出现列重复问题求助
解决数组合并后转结构化dtype出现列重复的问题
你遇到的问题根源在于:用np.concatenate得到的是普通二维数组(形状(5000,9)),直接调用astype(ds_dt)时,numpy无法正确将普通数组的列映射到结构化dtype的字段,反而会把每行的所有值广播到每个字段,最终导致每列重复9次。
下面是两种可行的解决方案:
方法一:用np.core.records.fromarrays直接生成结构化数组
这种方法不需要先合并普通数组,直接将两个输入数组的列按字段组合:
import numpy as np namesList = ['EID', 'Domain', 'LAM ID1', 'LAM ID2','LAM ID3', 'LAM ID4', 'LAM ID5', 'LAM ID6', 'LAM ID7'] formatsList = ['int', 'int', 'float', 'float', 'float', 'float', 'float', 'float', 'float'] # 把两个数组的列拆分后合并成一个列表 all_cols = list(LAM_Strength_RFs_Data.T) + list(LAM_Strength_RFs.T) # 生成结构化数组 Final_Lam_Strength = np.core.records.fromarrays( all_cols, names=namesList, formats=formatsList )
方法二:创建空结构化数组后逐字段赋值
先初始化符合要求的结构化数组,再分别把两个输入数组的列赋值到对应字段:
import numpy as np namesList = ['EID', 'Domain', 'LAM ID1', 'LAM ID2','LAM ID3', 'LAM ID4', 'LAM ID5', 'LAM ID6', 'LAM ID7'] formatsList = ['int', 'int', 'float', 'float', 'float', 'float', 'float', 'float', 'float'] ds_dt = np.dtype({'names':namesList, 'formats':formatsList}) # 创建空的结构化数组,长度5000 Final_Lam_Strength = np.empty(5000, dtype=ds_dt) # 赋值整数数组的两列 Final_Lam_Strength['EID'] = LAM_Strength_RFs_Data[:, 0] Final_Lam_Strength['Domain'] = LAM_Strength_RFs_Data[:, 1] # 循环赋值浮点数数组的七列 for idx in range(7): Final_Lam_Strength[f'LAM ID{idx+1}'] = LAM_Strength_RFs[:, idx]
用这两种方法生成的结构化数组,每个字段对应原来数组的一列,不会出现重复问题,之后可以直接写入H5文件作为带列标题的数据集。
内容的提问来源于stack exchange,提问作者Tom Handford
相关产品推荐
相关产品推荐

