【发布时间】: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位值,必须满足以下条件:
- 行中的每个值都需要被视为其二进制/位等效项
- 垂直读取,每行对齐的位,向下 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