Numpy打开字节并撤消订单

时间:2017-09-05 15:08:49

标签: python numpy

我有一个大小为10 MB的二进制文件,我要对这个文件做的是逐位读取。在Python-Numpy中,据我所知,我们不能一点一点地读取数据而是字节。因此,为了逐位读取数据,首先使用np.fromfile函数读取文件,然后使用np.unpackbits函数将字节解压缩为8位。这是脚本我是如何做到的:

fbyte = np.fromfile(binar_file, dtype='uint8')
fbit = np.unpackbits(fbyte)

我在fbit中所拥有的是一个长二进制文件但是每8位(MSB-LSB)都有反转顺序,例如10010011 ...,我实际上预期的是LSB-MSB就像这个11001001.通过使用for循环每8位翻转二进制文件的顺序将解决问题,但由于我想读取数千个文件,我需要一些时间来避免。所以我的问题是,有没有办法将字节解压缩到位,但直接按LSB-MSB的顺序。正如比较,在Matlab中这个过程很容易做到,因为有Matlab函数fread我可以指定位配置,例如'ubit1'用于逐位读取,结果如我所料 - > LSB - MSB。任何帮助/提示将不胜感激。感谢。

2 个答案:

答案 0 :(得分:2)

您可以简单地重塑2D保留8列,然后将其翻转,就像这样 -

np.unpackbits(fbyte).reshape(-1,8)[:,::-1]

示例运行 -

In [1176]: fbyte
Out[1176]: array([253,  35, 198, 182,  62], dtype=uint8)

In [1177]: np.unpackbits(fbyte).reshape(-1,8)[:,::-1]
Out[1177]: 
array([[1, 0, 1, 1, 1, 1, 1, 1],
       [1, 1, 0, 0, 0, 1, 0, 0],
       [0, 1, 1, 0, 0, 0, 1, 1],
       [0, 1, 1, 0, 1, 1, 0, 1],
       [0, 1, 1, 1, 1, 1, 0, 0]], dtype=uint8)

一百万个元素阵列上的计时 -

In [1173]: fbyte = np.random.randint(0,255,(1000000)).astype(np.uint8)

In [1174]: %timeit np.unpackbits(fbyte).reshape(-1,8)[:,::-1]
1000 loops, best of 3: 541 µs per loop

对我来说似乎很疯狂!

答案 1 :(得分:0)

在NumPy 1.17和更高版本中,unpackbits接受将完成此操作的bitorder参数-只需将bitorder="little"传递给np.unpackbits调用即可。