我有一个大小为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。任何帮助/提示将不胜感激。感谢。
答案 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
调用即可。