Numpy数组转bytearray后转回原数组出现多余零值的原因
为何Numpy数组转bytearray后转回时出现大量零值?
测试代码
import numpy as np ar_1=np.array([23,27,44,56]) byte_ar=bytearray(ar_1) print("Array :",ar_1) print("Array to bytes :",byte_ar) to_ar=np.array(byte_ar) print("Back to array :",to_ar)
实际输出
Array : [23 27 44 56] Array to bytes : bytearray(b'\x17\x00\x00\x00\x1b\x00\x00\x00,\x00\x00\x008\x00\x00\x00') Back to array : [23 0 0 0 27 0 0 0 44 0 0 0 56 0 0 0]
预期输出
Back to array : [23 27 44 56 ]
原因分析
问题核心在于Numpy数组默认类型和bytearray的存储逻辑:
- 你创建的
ar_1默认是int32类型(每个元素占4字节),转bytearray时,每个int32元素会被拆成4个字节按小端模式存储(低位字节在前)。因为你的原数值都小于256,所以每个元素只有低8位是有效数值,剩下3个高位字节都是0,这就是输出里\x17\x00\x00\x00这类内容的由来。 - 用
np.array(byte_ar)转回时,Numpy会把bytearray里的每个字节当作单独元素,原来1个int32元素就变成了4个元素(有效数值+3个0),最终数组长度变成16。
解决方法
有两种直接的修复方式:
方式1:转bytearray前指定单字节数据类型
把数组类型改成uint8(每个元素占1字节),转bytearray时每个元素只会生成1个字节,转回时直接还原:
import numpy as np ar_1=np.array([23,27,44,56], dtype=np.uint8) # 指定uint8类型 byte_ar=bytearray(ar_1) print("Array :",ar_1) print("Array to bytes :",byte_ar) to_ar=np.array(byte_ar) print("Back to array :",to_ar)
输出符合预期:
Array : [23 27 44 56] Array to bytes : bytearray(b'\x17\x1b,8') Back to array : [23 27 44 56]
方式2:转回时用np.frombuffer指定原数据类型
如果不想修改原数组类型,用np.frombuffer直接按int32类型读取bytearray:
import numpy as np ar_1=np.array([23,27,44,56]) byte_ar=bytearray(ar_1) print("Array :",ar_1) print("Array to bytes :",byte_ar) to_ar=np.frombuffer(byte_ar, dtype=np.int32) # 指定按int32读取 print("Back to array :",to_ar)
输出同样符合预期:
Array : [23 27 44 56] Array to bytes : bytearray(b'\x17\x00\x00\x00\x1b\x00\x00\x00,\x00\x00\x008\x00\x00\x00') Back to array : [23 27 44 56]
内容的提问来源于stack exchange,提问作者Gega Jgarkava
相关产品推荐
相关产品推荐

