【问题标题】:Convert rows of hexadecimal values to binary, vertically by column将十六进制值的行垂直按列转换为二进制
【发布时间】:2014-06-22 03:46:17
【问题描述】:

我正在处理来自串行设备的数据,该设备以非常有趣的格式输出其数据。该设备具有 256x256 像素阵列,而每个像素都有一个 14 位 值,通过移位寄存器读出。

为了显示格式,我将说明它,如果每个像素都有一个 6 位 值:

'像素#' 0-8 9-16 17-24 25-32 33-40 41-48 48-56 57-64 ... 256 -------------------------------------------------- ------------ 0 255 255 255 255 255 255 255 255 ... 1 127 255 255 255 255 255 255 255 ... 2 255 255 255 255 255 255 255 255 ... 3 255 255 255 255 255 255 255 255 ... 4 255 255 255 255 255 255 255 255 ... 5 255 255 255 255 255 255 255 255 ... 请注意,第二行以值 127 开头

要获得第一个像素(像素#0)的6位值,必须满足以下条件:

  1. 行中的每个值都需要被视为其二进制/位等效项
  2. 垂直读取,每行对齐的位,向下 6 行(对于 6 位 输出值),得到该像素的值

即:

'像素#' 0-8 9-16 17-24 25-32 ... 256 -------------------------------------------------- ------------ 0 *1*1111111 11111111 11111111 11111111 ... 1 *0*1111111 11111111 11111111 11111111 ... 2 *1*1111111 11111111 11111111 11111111 ... 3 *1*1111111 11111111 11111111 11111111 ... 4 *1*1111111 11111111 11111111 11111111 ... 5 *1*1111111 11111111 11111111 11111111 ... 请注意,第二行的值为 127,即二进制 01111111 --> 像素 0 = 101111 = 47

现在,在所有 256 列中重复该操作,然后向下移动到接下来的 6 行并重复。

实际输出需要是 256x256 的像素值数组。我需要处理的实际数据集是每个像素 14 位 - 它是 3584x32(14 位 * 256 像素 = 3584 行......和 ​​32 字节 * 8 位/字节 = 32 字节)。

处理数据集的最佳方法是什么?此外,速度是至关重要的问题,那么是否有一些可以利用的高速功能?

感谢您的帮助 - 谢谢!


编辑:

要回答有关所需速度的问题 - 理想情况下,我希望以至少 10 倍/秒的速度执行此操作,因为数据以 60 倍/秒的速度输入。因此,我认为我需要避免常见的“连接”和字符串操作,因为我认为这些操作很慢。

同样,真实数据集 (3584x32) 的每个像素都有 14 位,所以它是 3584x32。

这是我正在使用的函数,使用 Joran 的方法,在提供真实数据集时需要约 2.6 秒来执行:

def GetFrame(RawData):
    if np.shape(RawData) == (3584, 32):
        ProcessedData = np.zeros((256, 256), dtype='int16')
        data_blocks = [RawData[d:d+14] for d in range(0, 3584, 14)]
        for p in range(256):
            data_bin_rows = ["".join(map(lambda val:"{0:08b}".format(val,), row)) for row in data_blocks[p]]
            ProcessedData[p][:] = [int("".join(v),2) for v in zip(*data_bin_rows)]
        return ProcessedData
    else:
        return False

如何更快地缩短执行时间?谢谢!

【问题讨论】:

  • 在这种情况下你几乎肯定会受到设备i/o的限制,数字转换不是很复杂

标签: python c++ optimization numpy bit-manipulation


【解决方案1】:

我不得不读了几遍,但我想我明白了

data = \
"""255    255    255    255    255    255    255    255
127    255    255    255    255    255    255    255
255    255    255    255    255    255    255    255
255    255    255    255    255    255    255    255
255    255    255    255    255    255    255    255
255    255    255    255    255    255    255    255"""

data_rows = [map(int,row.split()) for row in data.splitlines()]
data_bin_rows = ["".join(map(lambda val:"{0:08b}".format(val,),row)) for row in data_rows]
pixel_values = zip(*data_bin_rows)
print pixel_values[0],"=",int("".join(pixel_values[0]),2) #pixel0

不能说它的速度...但是如果您不以每秒一百万次的速度执行它可能是合理的...无论如何应该比串行读取快得多...

【讨论】:

    【解决方案2】:

    使用 numpy 应该足够快,否则你需要用汇编程序编写它:

    import numpy
    input_array = numpy.zeros((32,14,256), dtype="B")
    output_array = numpy.zeros((32,8,256), dtype='int16')
    for j in range(8):
        bits = (input_array[:,:,:]>>j) & 1
        for i in range(14):
            output_array[:,j,:]|= bits[:,i,:] << i
    

    【讨论】:

    • numpy 很棒......但是对于新手来说(有时对我来说也是)更难说出发生了什么 +1,因为这可能比我的解决方案快得多
    • 如何调整它以用于我在新编辑中提供的代码?我不知道如何让它与我的 numpy.zeros((14,32), dtype="B") 的“input_array”一起工作,用于我的一行像素
    猜你喜欢
    • 2012-06-26
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2013-07-25
    相关资源
    最近更新 更多