如何从已有独立向量创建numpy复合dtype结构化数组
问题原因
你尝试的c=np.array((a,b), dtype=myrecord)无法正常运行的核心原因是:该写法会将完整的数组a、b分别作为第一条记录的两个字段值传入,和你需要的逐行对应配对的逻辑不匹配。
实现方法
以下两种是numpy原生的高效实现方式,都可以得到你期望的结果:
方法1:逐字段赋值(逻辑最直观,优先推荐)
先初始化对应长度的空结构化数组,再逐个给字段赋值即可,大数组场景下性能优异:
import numpy as np myrecord = np.dtype([ ('col1', 'u4'), ('col2', 'f8') ]) a = np.array([1,2,3,4]) b = np.array([10.1,20.1,30.1,40.1]) # 初始化指定类型的空数组 c = np.empty(len(a), dtype=myrecord) # 按字段名对应赋值 c['col1'] = a c['col2'] = b
方法2:调用records模块的fromarrays方法
直接传入待合并的数组列表,指定dtype即可一步生成结果:
c = np.core.records.fromarrays([a, b], dtype=myrecord)
注意事项
不推荐使用np.array(list(zip(a,b)), dtype=myrecord)的写法:该方法会先将numpy数组转为Python原生的列表、元组对象,数据量较大时性能损耗非常明显。
执行上述任意一种方法后,打印c即可得到你期望的输出:
array([(1, 10.1), (2, 20.1), (3, 30.1), (4, 40.1)], dtype=[('col1', '<u4'), ('col2', '<f8')])
内容的提问来源于stack exchange,提问作者M.E.
相关产品推荐
相关产品推荐

