Python Numpy解包字节并颠倒顺序
我有一个10 MB大小的二进制文件,我想用这个文件一点一点地读取。在Python-Numpy中,据我所知,我们不能一点一点地读取数据,只能读取字节。因此,为了逐位读取数据,首先我使用np.fromfile函数读取文件,然后使用np.unpackbits函数将字节解压为8位。以下是我如何做到这一点的脚本:Python Numpy解包字节并颠倒顺序,python,numpy,Python,Numpy,我有一个10 MB大小的二进制文件,我想用这个文件一点一点地读取。在Python-Numpy中,据我所知,我们不能一点一点地读取数据,只能读取字节。因此,为了逐位读取数据,首先我使用np.fromfile函数读取文件,然后使用np.unpackbits函数将字节解压为8位。以下是我如何做到这一点的脚本: fbyte = np.fromfile(binar_file, dtype='uint8') fbit = np.unpackbits(fbyte) 我在fbit中看到的是一个长的二进制文件,
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。如有任何帮助/提示,将不胜感激。谢谢。您可以简单地将
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
对我来说,似乎快疯了 在NumPy 1.17及更新版本中,unpackbits
接受一个bitorder
参数,该参数将完成此操作——只需将bitorder=“little”
传递给np.unpackbits
调用 你可以发布示例fbyte
?不要认为你需要一个循环。只需做:np.unpackbits(fbyte)。重塑(-1,8)[:,::-1]
。添加.ravel()
使其变平。@Divakar,非常感谢。它就像一个符咒。你真让我高兴!转换成一个职位。时间对我来说似乎很好,应该比循环版本快得多。