Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy解包字节并颠倒顺序_Python_Numpy - Fatal编程技术网

Python Numpy解包字节并颠倒顺序

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中看到的是一个长的二进制文件,

我有一个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。如有任何帮助/提示,将不胜感激。谢谢。

您可以简单地将
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,非常感谢。它就像一个符咒。你真让我高兴!转换成一个职位。时间对我来说似乎很好,应该比循环版本快得多。