如何从含已知大小bytes对象的Python列表创建NumPy数组
解决从bytes列表创建NumPy数组的问题
你遇到的问题是np.fromiter不支持直接使用B{size}这类固定长度字节数组类型处理列表中的bytes对象,因为它只能处理一维标量数据类型。
下面是两种可行的解决方案:
方案1:直接用np.array()转换(最简单)
直接将bytes列表传入np.array(),指定对应长度的字节字符串类型即可:
size = 10 byte_list = [np.random.default_rng().bytes(size) for i in range(100)] numpy_array = np.array(byte_list, dtype=f'S{size}') # 也可以用 dtype=np.dtype(f'B{size}'),效果一致 # 测试随机选择 test_vals = np.random.default_rng().choice(numpy_array, size=10)
这种方法会生成一维数组,每个元素是长度为10的字节对象,完全满足后续choice操作的需求。
方案2:拼接后用np.frombuffer重塑(更高效)
如果列表元素数量很大,可以先把所有bytes拼接成一个大的bytes对象,再转换为NumPy数组后重塑形状:
size = 10 byte_list = [np.random.default_rng().bytes(size) for i in range(100)] # 先拼接所有bytes,转换为uint8数组后重塑为(N, size)的二维数组 numpy_array = np.frombuffer(b''.join(byte_list), dtype=np.uint8).reshape(-1, size) # 若需要一维的字节数组元素,可再转换类型 numpy_array = numpy_array.view(f'S{size}').flatten() test_vals = np.random.default_rng().choice(numpy_array, size=10)
这种方法在处理超大规模数据时性能更优,不过需要注意类型转换的步骤。
错误原因说明
np.fromiter的设计目标是逐个处理可迭代对象中的标量元素,而B{size}属于固定长度的复合字节类型,无法被fromiter识别处理,因此会抛出数据类型不被支持的错误。
内容的提问来源于stack exchange,提问作者aabceh
相关产品推荐
相关产品推荐

