如何在NumPy数组中存储含\x00的字节数组?避免末尾空字节截断
解决NumPy截断末尾\x00字节的问题
NumPy默认会把字节数组当作C风格字符串处理,自动截断末尾的\x00字符,要保留完整字节序列可以用以下几种方法:
方法1:显式指定固定长度的字节类型
创建数组时通过dtype参数指定对应长度的字节类型,比如你的示例中b'abc\x00'是4个字节,就用'S4':
import numpy as np a = np.array([b'abc\x00'], dtype='S4') print(a[0]) # 输出 b'abc\x00'
如果有多条长度不一的字节串,先计算最大长度再统一指定:
byte_strings = [b'abc\x00', b'defg\x00\x00'] max_len = max(len(s) for s in byte_strings) a = np.array(byte_strings, dtype=f'S{max_len}') print(a[0]) # b'abc\x00' print(a[1]) # b'defg\x00\x00'
方法2:使用np.void类型
void类型会直接存储原始字节,不会解析为字符串,自然不会截断空字符。取出时需要转换回bytes:
a = np.array([b'abc\x00'], dtype=np.void) print(a[0].tobytes()) # b'abc\x00'
方法3:使用np.bytes_类型并指定长度
和方法1逻辑一致,用np.bytes_指定长度来固定存储:
a = np.array([b'abc\x00'], dtype=np.bytes_(4)) print(a[0]) # b'abc\x00'
原理说明
NumPy默认处理字节串时,会默认按C风格字符串规则解析,遇到\x00就认为是字符串结束。显式指定存储长度或者使用非字符串类型,就能绕过这个解析逻辑,完整保留所有字节内容。
内容的提问来源于stack exchange,提问作者fprefect
相关产品推荐
相关产品推荐

