首页 > 解决方案 > 如何从字节数组中提取 2-9 位数组?

问题描述

我有一个 100,000 长的字节数组,其中每 16 位行是一个 10 位地址和连接的 6 位计数。我想以数组方式、有效的方式将 16×100,000 数组转换为两个单独的(地址和数据)数组。较短的运行时间对我的应用程序至关重要。

到目前为止我所拥有的是

  1. 将二进制文件读入 uint16 数组
    f = open(curfile, mode="r")
    aint = np.fromfile(f, dtype=np.uint16)
  1. 读取for循环中的每一行
    line = '{0:15b}'.format(aint[nn])
  1. 从二进制中提取整数
    addr[nn] = 2**8*return0ifempty(line[0]) + return0ifempty(line[1:9])
    count[nn] = line[-6:]

(return0ifempty 在输入 ' ' 时返回 0)

整个 binary => uint16 => binary => uint16 的想法是极其低效的。必须有更好的方法来做到这一点。有什么方法可以像在 matlab 中那样截断数组,例如 A(5:10,:)?

标签: python-3.xnumpymultidimensional-arraybinarytype-conversion

解决方案


假设您想要低 10 位和高 6 位:

low_10 = aint & 1023
high_6 = aint >> 10

如果你想要低 6 位和高 10 位:

low_6 = aint & 63
high_10 = aint >> 6

与 Python 循环不同,它是矢量化的,运行速度要快得多(也不会转换为字符串)。

编辑:看你的例子,你想要 10 高的 addr 和 6 低的计数;所以...

count = aint & 63
addr = aint >> 6

一些解释63:它是0b111111,所以& 63将保留 6 个低位并关闭任何高位。


推荐阅读