在 numpy 中有没有办法创建一个布尔数组,每个条目只使用 1 位?
标准的 np.bool
类型是1个字节,但是这样我使用了8倍所需的内存。
在谷歌上我发现 C++ 有 std::vector<bool>
。
原文由 Andrea Zonca 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 numpy 中有没有办法创建一个布尔数组,每个条目只使用 1 位?
标准的 np.bool
类型是1个字节,但是这样我使用了8倍所需的内存。
在谷歌上我发现 C++ 有 std::vector<bool>
。
原文由 Andrea Zonca 发布,翻译遵循 CC BY-SA 4.0 许可协议
为此,您可以使用 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=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 许可协议
2 回答5.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
您可能想看看位 串( 此处 的文档)。
如果您从文件中创建
ConstBitArray
或ConstBitStream
,那么它将使用mmap
而不会将其加载到内存中。在这种情况下,它不会是可变的,因此如果您想进行更改,则必须将其加载到内存中。例如创建而不加载到内存中:
或者