如何将形状为(1900,)的float64类型NumPy数组转换为二维码?
将一维NumPy数组转换为二维码的方法
要把形状为(1900,)的float64数组转成二维码,核心思路是先将数组序列化为可编码的二进制数据,再用二维码库生成对应二维码。以下是具体实现步骤:
前置依赖
先安装所需的Python库:
pip install numpy segno pillow pyzbar
方法1:压缩后生成单二维码(适配大容量数组)
你的1900个float64元素序列化后是1900*8=15200字节,远超单个二维码的容量上限,因此需要先通过压缩缩小体积:
import numpy as np import segno import zlib # 替换为你的完整NumPy数组 arr = np.array([70000., -0., 60000., 400000., 300000., -0., -400000., -2100000., 2150000., -700000., -0., 0., 470000., 480000., 370000., 420000., 930000., 0., 0., 0., -20000., 60000., 880000., 880000., -10000., -220000., -2290000., 2420000., -520000., -0., -0., 790000., 560000., 740000., 910000., 930000., 0., -10000., -30000., -10000., 60000., 1020000., 960000., -0., 240000., -1260000., 2460000., -570000., -0., -0., 1290000., 400000., 750000., 860000., 930000., 0., -10000., -150000., 0., 60000., 1040000., 1130000., -10000., 660000., -1140000., 2350000., -680000., -0., -0., 870000., 200000., 660000., 1100000., 930000., 0., -0., -250000., 10000., 60000., 710000., 950000., -10000., 510000., -960000., 1920000., -990000., -0., -0., 420000., -90000., 480000., 1100000., 930000., 0., 10000., -280000., 20000., 60000., 480000., 760000.], dtype=np.float64) # 1. 序列化数组为二进制字节流,再压缩 arr_bytes = arr.tobytes() compressed_bytes = zlib.compress(arr_bytes) print(f"原始字节大小:{len(arr_bytes)},压缩后:{len(compressed_bytes)}") # 2. 生成二维码(segno自动选择适配的版本和高容错率) qr = segno.make(compressed_bytes, error='h') # 3. 保存二维码图片,scale控制清晰度 qr.save('compressed_numpy_qr.png', scale=5)
解码还原数组
要从二维码恢复原始数组,执行以下代码:
from PIL import Image import pyzbar.pyzbar as pyzbar import numpy as np import zlib # 读取二维码图片并提取压缩数据 img = Image.open('compressed_numpy_qr.png') decoded_compressed = pyzbar.decode(img)[0].data # 解压数据并还原为NumPy数组 restored_bytes = zlib.decompress(decoded_compressed) restored_arr = np.frombuffer(restored_bytes, dtype=np.float64) print(restored_arr.shape) # 输出应为(1900,)
方法2:拆分数据为多二维码(压缩后仍超容量时)
如果压缩后的数据还是超过单个二维码容量,可将数据拆分后生成多个二维码:
import numpy as np import segno import zlib arr = np.array([70000., -0., 60000., ...], dtype=np.float64) arr_bytes = arr.tobytes() compressed_bytes = zlib.compress(arr_bytes) # 拆分数据块,每个块不超过1800字节(适配Version40高容错二维码容量) block_size = 1800 blocks = [compressed_bytes[i:i+block_size] for i in range(0, len(compressed_bytes), block_size)] # 生成多个二维码,按序号命名 for idx, block in enumerate(blocks): qr = segno.make(block, error='h') qr.save(f'qr_block_{idx}.png', scale=5)
解码还原(多二维码拼接)
from PIL import Image import pyzbar.pyzbar as pyzbar import numpy as np import zlib # 读取所有二维码块并拼接数据 restored_blocks = [] for idx in range(len(blocks)): img = Image.open(f'qr_block_{idx}.png') block_data = pyzbar.decode(img)[0].data restored_blocks.append(block_data) # 拼接、解压、还原数组 combined_compressed = b''.join(restored_blocks) restored_bytes = zlib.decompress(combined_compressed) restored_arr = np.frombuffer(restored_bytes, dtype=np.float64)
关键注意事项
- 序列化方式选择:
tobytes()直接存储原始二进制数据,是最紧凑的序列化方式,比JSON/CSV等文本格式节省大量空间。 - 二维码容量限制:单个QR Code的容量由版本和容错率决定,高容错版本(H)容量略低但抗损坏能力强。
- 压缩效率:zlib压缩对数值数组的压缩效果较好,可大幅降低数据体积。
内容的提问来源于stack exchange,提问作者AbuMuhandisAlTurki
相关产品推荐
相关产品推荐

