答案 0 :(得分:15)
您需要bitarray:
有效的布尔数组 - C扩展名
该模块提供了一种有效表示布尔数组的对象类型。 Bitarrays是序列类型,其行为与通常列表非常相似。八个位由连续的存储器块中的一个字节表示。用户可以在两种表示之间进行选择; little-endian和big-endian。所有功能都在C中实现。提供了用于访问机器表示的方法。当需要对二进制文件进行位级访问时,这可能很有用,例如便携式位图图像文件(.pbm)。此外,在处理使用可变位长编码的压缩数据时,您可能会发现此模块很有用......
答案 1 :(得分:10)
如果您从文件创建ConstBitArray
或ConstBitStream
,那么它将使用mmap
而不会将其加载到内存中。在这种情况下,它不会是可变的,所以如果你想进行更改,它必须加载到内存中。
例如创建时不加载到内存中:
>>> a = bitstring.ConstBitArray(filename='your_file')
或
>>> b = bitstring.ConstBitStream(a_file_object)
答案 2 :(得分:10)
为此,您可以使用numpy的原生packbits和unpackbits。第一个功能是直接使用,但要重建,您将需要额外的操作。这是一个例子:
import numpy as np
# original boolean array
A1 = np.array([
[0, 1, 1, 0, 1],
[0, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
], dtype=np.bool)
# packed data
A2 = np.packbits(A1, axis=None)
# checking the size
print len(A1.tostring()) # 15 bytes
print len(A2.tostring()) # 2 bytes (ceil(15/8))
# reconstructing from packed data. You need to resize and reshape
A3 = np.unpackbits(A2, axis=None)[:A1.size].reshape(A1.shape).astype(np.bool)
# and the arrays are equal
print np.array_equal(A1, A3) # True