python如何通过列表转换为二维码?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python如何通过列表转换为二维码?相关的知识,希望对你有一定的参考价值。
我有一个列表all=[1,1,1,1,1,1,1,0,1,0,1,1,0,0,......共441个0和1]
现在想做一个21*21的二维码其中,0为白色,1为黑色.
我用 Pillow 的 Image 模块试了一下,生成图片如下,尺寸是 210*210,21*21 的太小了显示效果不好,你可以改代码调整尺寸的 (我重新编辑了图片,划花了,不然会被识别成二维码被系统吞掉)
代码如下:
追问#!/bin/python
from PIL import Image
import random
import math# 44100 像素点总和,改为 441 最后尺寸就是 21*21 了
all = [ random.choice(range(0,2)) for i in range(44100) ]
row = int(math.sqrt(len(all)))
col = row
img = Image.new('RGB', (row, col), 'white')
i = 0
for x in range(0, row - 1):
for y in range(0, col - 1):
if all[i] == 1:
img.putpixel((x,y), 0)
i += 1
img.save('qr.jpeg')
img.close()
我试了一下,有点bug,二维码错位了,我研究了一下,我把for循环中范围row-1和col-1换成row和col就正常了
追答对,你是对的,一时没注意 range 的范围是 [x, y), 不包括结尾
参考技术A Python有好几个模块(例如qrcode、MyQR)可以一两行代码就生成一个二维码,也有解码二维码以了解原始字符串的代码,简单方便。下面介绍qrcode模块和MyQR模块。一、qrcode模块
import qrcode
img=qrcode.make("略旅人率略")
img.save("test.jpg")123123qrcode.make()括号里可放网址链接、中文字符串、英文字符串。
二、MyQR模块样例如下:
from MyQR import myqr#myqr.run('dfdf') #可以只带一个参数生成二维码,也可以指定多个参数myqr.run(words='dfdf',picture='E:/资料/壁纸/壁纸-柴犬.png',version=5,level="H",colorized=True,contrast=1.0,brightness=1.0)12341234。
如何在python中将一维值列表转换为0和1的二维网格[重复]
【中文标题】如何在python中将一维值列表转换为0和1的二维网格[重复]【英文标题】:How to transform 1D list of values to 2D grid of 0's and 1's in python [duplicate] 【发布时间】:2020-05-10 02:36:49 【问题描述】:我想获取一个值列表并将它们转换为 0 和 1 的表(2D 列表),源列表中的每个唯一数字有一列,原始行数相同。如果该列索引与原始值 1 匹配,则每行将有一个 1。
我有完成这项任务的代码,但我想知道是否有更好/更快的方法来完成它。 (与下面的简化集相比,实际数据集有数百万个条目)
示例输入:
value_list = [1, 2, 1, 3, 6, 5, 4, 3]
期望的输出:
output_table = [[1, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 1, 0, 0],
[0, 0, 1, 0, 0, 0]]
当前解决方案:
value_list = [1, 2, 1, 3, 6, 5, 4, 3]
max_val = max(value_list)
# initialize to table of 0's
a = [([0] * max_val) for i in range(len(value_list))]
# overwrite with 1's where required
for i in range(len(value_list)):
j = value_list[i] - 1
a[i][j] = 1
print(f'a = ')
for row in a:
print(f'row')
【问题讨论】:
如果您要处理大量数据,则可能值得使用 NumPy。它是什么样的数据? 它来自一个文本文件(我在另一个步骤中将其提取到一维值列表中)。源数据中的所有数字都是整数。 这基本上是one-hot编码。如果你可以使用 NumPy,你的生活会更轻松。我已经标记了一个副本供您查看 如果您正在寻找减少处理(甚至可能是内存),可以将numpy.ndarray
子类化,这样底层数据只是value_list
的内容,但返回的视图看起来像output_table
。
import numpy as np; a = np.array([1, 2, 1, 3, 6, 5, 4, 3]); b = np.arange(1,a.max()+1); c = 1 * (a[:,None] == b[None,:])
【参考方案1】:
你可以这样做:
import numpy as np
value_list = [1, 2, 1, 3, 6, 5, 4, 3]
# create matrix of zeros
x = np.zeros(shape=(len(value_list), max(value_list)), dtype='int')
for i,v in enumerate(value_list):
x[i,v-1] = 1
print(x)
输出:
[[1 0 0 0 0 0]
[0 1 0 0 0 0]
[1 0 0 0 0 0]
[0 0 1 0 0 0]
[0 0 0 0 0 1]
[0 0 0 0 1 0]
[0 0 0 1 0 0]
[0 0 1 0 0 0]]
【讨论】:
您可以在创建初始数组x
后,通过x[np.arange(len(value_list)), np.array(value_list) - 1] = 1
不循环地同时分配所有行。【参考方案2】:
你可以试试这个:
dummy_list = [0]*6
output_table = [dummy_list[:i-1] + [1] + dummy_list[i:] for i in value_list]
输出:
output_table = [[1, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 1, 0, 0],
[0, 0, 1, 0, 0, 0]]
【讨论】:
以上是关于python如何通过列表转换为二维码?的主要内容,如果未能解决你的问题,请参考以下文章
使用生成器以及递归实现二维乃至多维列表转换成一维列表(python实现)