You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:22:48