我有一个有趣的小问题。
我需要制作一个函数,将诸如"John Doe"
或"New York 10001"
之类的字符串作为输入。对输出有一些要求。
NxM
矩阵,不一定是正方形。要求3是软性的,因为要在2x2矩阵和100x100矩阵之间保持视觉相似性是很困难的。
我编写了一些简单的代码,可以满足要求1)和2)
import numpy as np
import matplotlib.pyplot as plt
def char_to_bin(string, h, l):
_bin = bin(int.from_bytes(string.encode(), 'big'))[2:]
print(len(_bin))
_array = np.array(list(_bin)).astype('int')
res = abs(h*l - len(_array))
if (res & 1) == 1:
r1, r2 = res//2, res//2 + 1
if (res & 1) == 0:
r1, r2 = res//2, res//2
if len(_array) == h*l:
return _array.reshape(h, l)
if len(_array) < h*l:
_array = np.pad(_array, (r1, r2), 'wrap')
return _array.reshape(h, l)
if len(_array) > h*l:
a1 = _array.copy()
a2 = a1[r1:]
a3 = a2[:-r2]
return a3.reshape(h, l)
London2020 = char_to_bin('London', 20, 20)
London1010 = char_to_bin('London 1010', 5, 5)
plt.imshow(London55)
plt.imshow(London2020)
如您所见,需求3显然在我当前的实现中缺少很多。有人有更好的主意吗?显然,类似QR码(在角落没有正方形)会很有用,但是QR码也不能满足要求3)。
有什么好主意吗?
答案 0 :(得分:2)
在矩阵上有一个称为Kronecker product的操作,可用于以另一个矩阵为模式以更大的比例复制一个矩阵的结构。您可以使用它获取0/1矩阵和replicate them at larger scales:
如果您采用较小的(例如4x4)随机二进制模式,然后通过Kronecker乘积进行多次乘积,则可以获得具有相同自相似结构的更大,更详细的图像。这样一来,您就可以获取可在多个比例级别上使用的图像。
基本思想是这样的:给定一个m×n矩阵,制作一个m 2 ×n 2 矩阵,您可以将其替换为原始m×n矩阵与原始m×n矩阵的另一个副本。具体来说,每个1位都替换为原始矩阵的副本,每个0位都替换为m×n的零矩阵。
答案 1 :(得分:1)
我不确定我是否完全理解您的问题,但是,如果我理解它,这是算法的建议:
n
,并且每个字符给您8位,请将输入转换为8n
位的列表。h
和l
。计算k
,使k*h*k*l
大约为8n
; 即,k = sqrt(8n / (h * l))