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

如何将形状为(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:33:20