如何从字节数组中提取2-9位的数组?

时间:2019-08-30 03:54:24

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

我有一个100,000长的字节数组,其中每16位行是一个10位地址,而6位计数是连接在一起的。我想以一种数组有效的方式将16 x 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 =>二进制=> uint16的想法效率极低。必须有更好的方法来做到这一点。是否有任何方法可以像Matlab中那样截断数组,例如A(5:10,:)?

1 个答案:

答案 0 :(得分:1)

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

low_10 = aint & 1023
high_6 = aint >> 10

如果要低6位,高10位:

low_6 = aint & 63
high_10 = aint >> 6

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

编辑:在您的示例中,您希望addr为10高,count为6低;所以...

count = aint & 63
addr = aint >> 6

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