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

新手上路,请多包涵

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

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

在谷歌上我发现 C++ 有 std::vector<bool>

原文由 Andrea Zonca 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 465
2 个回答

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

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

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

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

或者

>>> b = bitstring.ConstBitStream(a_file_object)

原文由 Scott Griffiths 发布,翻译遵循 CC BY-SA 4.0 许可协议

为此,您可以使用 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=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, count=A1.size).reshape(A1.shape).view(bool)

# and the arrays are equal
print(np.array_equal(A1, A3)) # True


在 numpy 1.17.0 之前,第一个函数可以直接使用,但重建需要额外的操作。这是一个例子:

 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

原文由 Salvador Dali 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题