相同字节宽度下numpy普通数组转结构化数组的简便方法
最优解决方案
直接使用numpy.ndarray.view()方法重解释内存即可,不需要手动遍历解析字节,符合你要求的单行实现,适配任意结构化dtype:
structured_array = array.view(my_type).squeeze()
针对你给出的示例,需要注意自定义dtype的字节序配置,因为你预期的checksum是大端序解析结果,需要把dtype定义调整为:
my_type = np.dtype([('checksum','>u2'), ('word', 'B', (3,))])
运行后得到的结果完全匹配你预期的输出:
array([( 258, [ 3, 4, 5]), (2828, [13, 14, 15])], dtype=[('checksum', '>u2'), ('word', 'u1', (3,))])
相关说明
view()方法不会复制原始数据,只是修改numpy对同一段内存的解析规则,性能远高于循环遍历方案。- 如果你的结构化dtype存在对齐填充,创建dtype时需要指定
align=False,保证dtype总字节长度和原始数组的行字节宽度完全一致,避免解析错位。 - 数值类型的字节序需要和实际数据存储逻辑匹配:
<前缀代表小端序,>前缀代表大端序,不指定时默认使用当前系统的原生字节序,可能导致多字节字段的解析结果不符合预期。
内容的提问来源于stack exchange,提问作者megasplash
相关产品推荐
相关产品推荐

