具有1位条目的numpy布尔数组

时间:2011-04-09 00:54:12

标签: python numpy boolean

在numpy中有没有办法创建一个布尔数组,每个条目只使用1位?

标准np.bool类型是1个字节,但这样我使用所需内存的8倍。

在Google上,我发现C ++有std::vector<bool>

3 个答案:

答案 0 :(得分:15)

您需要bitarray

  

有效的布尔数组 - C扩展名

     

该模块提供了一种有效表示布尔数组的对象类型。 Bitarrays是序列类型,其行为与通常列表非常相似。八个位由连续的存储器块中的一个字节表示。用户可以在两种表示之间进行选择; little-endian和big-endian。所有功能都在C中实现。提供了用于访问机器表示的方法。当需要对二进制文件进行位级访问时,这可能很有用,例如便携式位图图像文件(.pbm)。此外,在处理使用可变位长编码的压缩数据时,您可能会发现此模块很有用......

答案 1 :(得分:10)

您可能需要查看bitstring(文档here)。

如果您从文件创建ConstBitArrayConstBitStream,那么它将使用mmap而不会将其加载到内存中。在这种情况下,它不会是可变的,所以如果你想进行更改,它必须加载到内存中。

例如创建时不加载到内存中:

>>> a = bitstring.ConstBitArray(filename='your_file')

>>> b = bitstring.ConstBitStream(a_file_object)

答案 2 :(得分:10)

为此,您可以使用numpy的原生packbitsunpackbits。第一个功能是直接使用,但要重建,您将需要额外的操作。这是一个例子:

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