Python 带有1位条目的numpy布尔数组

Python 带有1位条目的numpy布尔数组,python,numpy,boolean,Python,Numpy,Boolean,在numpy中有没有一种方法可以创建一个布尔数组,每个条目只使用1位 标准的np.bool类型是1字节,但这样我使用的内存是所需内存的8倍 上,我发现C++有.< /p> 你想要a: boolean-C扩展的有效数组 该模块提供了一种对象类型,可以有效地表示布尔数组。位数组是序列类型,其行为非常类似于通常的列表。八位由连续内存块中的一个字节表示。用户可以在两种表示形式之间进行选择;小端和大端。所有功能都用C语言实现。提供了访问机器表示的方法。当需要对二进制文件(如便携式位图图像文件.pbm)进行

在numpy中有没有一种方法可以创建一个布尔数组,每个条目只使用1位

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

<谷歌>上,我发现C++有.< /p> 你想要a:

boolean-C扩展的有效数组

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


您可能想看看文档

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

例如,在不加载到内存的情况下创建:

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


要做到这一点,您可以使用numpy的本机和。第一个函数可以直接使用,但要重建,需要进行额外的操作。以下是一个例子:

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

谢谢它看起来非常有用,这里唯一缺少的是I/O例程将所有文件加载到内存中,而使用'numpy.load'我可以使用memorymap。将此位数组转换回numpy数组容易吗?你能添加一个小例子来证明这一点吗?因为我只写了一次,所以我不需要修改我的数据。作为附录,我正在努力改进这个答案:。我们的目标是使packbits和unpackbits完全可逆,而无需重塑。物理学家说,这将是一件伟大的事情。谢谢你这么做。完成后,请写下自己的答案或编辑我的答案。@Salvadodali似乎是PR这里唯一的问题是压缩数组意味着在内存中同时包含压缩和未压缩的数组,但有时您根本没有足够的ram来包含较大的数组,这就是为什么您希望使用压缩格式
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