【问题标题】:How do I extract an array of bits 2-9 from a bytearray?如何从字节数组中提取 2-9 位数组?
【发布时间】:2020-01-03 07:51:37
【问题描述】:

我有一个 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)

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

【问题讨论】:

    标签: python-3.x numpy multidimensional-array binary type-conversion


    【解决方案1】:

    假设你想要低 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 个低位并关闭所有高位。

    【讨论】:

      猜你喜欢
      • 2017-03-02
      • 2019-12-13
      • 1970-01-01
      • 2019-08-15
      • 2017-09-28
      • 2019-07-23
      • 2013-03-15
      • 2012-05-20
      • 2016-01-15
      相关资源
      最近更新 更多