将字符串或数字映射到NxM二进制矩阵

时间:2020-09-08 15:50:00

标签: python algorithm plot

我有一个有趣的小问题。

我需要制作一个函数,将诸如"John Doe""New York 10001"之类的字符串作为输入。对输出有一些要求。

  1. 应该是NxM矩阵,不一定是正方形。
  2. 只能是二进制。
  3. 输入不是必须与输出可逆。
  4. 在绘制图形时,图形必须在整个矩阵尺寸上保持视觉相似性

要求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)


enter image description here enter image description here

如您所见,需求3显然在我当前的实现中缺少很多。有人有更好的主意吗?显然,类似QR码(在角落没有正方形)会很有用,但是QR码也不能满足要求3)。

有什么好主意吗?

2 个答案:

答案 0 :(得分:2)

在矩阵上有一个称为Kronecker product的操作,可用于以另一个矩阵为模式以更大的比例复制一个矩阵的结构。您可以使用它获取0/1矩阵和replicate them at larger scales

Example of the Kronecker product

如果您采用较小的(例如4x4)随机二进制模式,然后通过Kronecker乘积进行多次乘积,则可以获得具有相同自相似结构的更大,更详细的图像。这样一来,您就可以获取可在多个比例级别上使用的图像。

基本思想是这样的:给定一个m×n矩阵,制作一个m 2 ×n 2 矩阵,您可以将其替换为原始m×n矩阵与原始m×n矩阵的另一个副本。具体来说,每个1位都替换为原始矩阵的副本,每个0位都替换为m×n的零矩阵。

答案 1 :(得分:1)

我不确定我是否完全理解您的问题,但是,如果我理解它,这是算法的建议:

  • 输入字符串。如果字符串的长度为n,并且每个字符给您8位,请将输入转换为8n位的列表。
  • 输入hl。计算k,使k*h*k*l大约为8nk = sqrt(8n / (h * l))
  • 按kh * kl的矩形矩阵排列您的位
  • 使用图像缩放算法获得大小为h * l的矩阵