使用其他Numpy数组创建结构化数组不符合预期的问题
解决Numpy结构化数组创建异常的问题
问题原因分析
当你直接将二维Numpy数组传入np.array()并指定结构化dtype时,Numpy会将数组的每个独立元素映射到结构化类型的字段,而非把每行作为一个完整的结构化条目。这就导致最终每个结构化字段被填充了整行数据,出现(2,2)的异常shape。
而你尝试的列表推导式[zz for zz in np.array(...)],得到的zz是Numpy一维数组而非元组/列表,Numpy依然会将其当作单个元素处理,导致字段shape异常。
三个有效解决方法
方法1:使用np.rec.fromarrays(推荐)
将原数组的列拆分为独立数组,对应结构化类型的每个字段:
import numpy as np # 原数组 arr = np.array([(1, 2), (3, 4)]) # 基于列数组创建结构化数组 structured_arr = np.rec.fromarrays( [arr[:, 0], arr[:, 1]], dtype=[('foo', 'i8'), ('bar', 'f4')] ) print(structured_arr['foo']) # 输出:array([1, 3], dtype=int64) print(structured_arr['foo'].shape) # 输出:(2,)
方法2:将原数组转为列表再构造
把原数组转换为嵌套列表(让每个子列表对应一个结构化条目),再传入np.array():
import numpy as np arr = np.array([(1, 2), (3, 4)]) # 转为列表后构造 structured_arr = np.array( arr.tolist(), dtype=[('foo', 'i8'), ('bar', 'f4')] ) print(structured_arr['foo']) # 输出:array([1, 3], dtype=int64) print(structured_arr['foo'].shape) # 输出:(2,)
方法3:使用view()调整类型(适合类型匹配场景)
如果原数组的数据类型与目标结构化类型兼容,可以直接用view()转换,同时调整形状:
import numpy as np arr = np.array([(1, 2), (3, 4)], dtype='i8') # 先统一类型 # 调整形状并转换为结构化类型 structured_arr = arr.reshape(-1).view([('foo', 'i8'), ('bar', 'f4')]) print(structured_arr['foo']) # 输出:array([1, 3], dtype=int64) print(structured_arr['foo'].shape) # 输出:(2,)
内容的提问来源于stack exchange,提问作者Niclas Eich
相关产品推荐
相关产品推荐

