繁体   English   中英

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

[英]numpy boolean array with 1 bit entries

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

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

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

为此,您可以使用 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

你想要一个位数组

高效的布尔数组——C 扩展

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

您可能想看看位此处的文档)。

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

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

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

或者

>>> b = bitstring.ConstBitStream(a_file_object)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM