如何将ByteString转换为由0和1组成的numpy数组?
ByteString转0/1组成的NumPy数组
要实现将ByteString转换为纯0和1的NumPy数组,核心是解析每个字节的二进制位并展开成一维数组,以下是两种可行方案:
方案一:字符串转换法(直观易懂)
先将ByteString转为uint8类型的NumPy数组(每个元素对应单个字节的十进制值),再把每个值转成8位二进制字符串,最后拆分拼接成0/1数组:
import numpy as np byte_str = b'\xed\x07b\x87S.\x866^\x84\x1e\x92\xbf\xc5\r\x8c' # 1. 将ByteString转为uint8数组(每个元素是0-255的字节值) byte_array = np.frombuffer(byte_str, dtype=np.uint8) # 2. 把每个字节值转成8位二进制字符串(补前导零) binary_strs = np.vectorize(lambda x: f"{x:08b}")(byte_array) # 3. 拼接所有二进制字符串,拆分为单个字符后转成int数组 binary_array = np.array(list(''.join(binary_strs)), dtype=np.int8)
方案二:位运算优化法(高效适合大数据)
通过位运算直接提取每个字节的每一位,避免字符串操作,性能更优:
import numpy as np byte_str = b'\xed\x07b\x87S.\x866^\x84\x1e\x92\xbf\xc5\r\x8c' # 1. 转为uint8数组 byte_array = np.frombuffer(byte_str, dtype=np.uint8) # 2. 生成8位掩码(从最高位到最低位:128,64,...,1) bit_masks = np.array([1 << i for i in range(7, -1, -1)], dtype=np.uint8) # 3. 按位与提取每一位,转成bool后再转为int,最后展平为一维数组 binary_array = (byte_array[:, None] & bit_masks).astype(bool).astype(np.int8).flatten()
验证说明
以示例中的第一个字节0xed为例,其二进制为11101101,转换后的数组开头8位会是[1,1,1,0,1,1,0,1],符合预期。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

