在numpy中有没有一种方法可以创建一个每个条目只使用1位的布尔数组?
标准的np.bool
类型是1字节,但这样我会使用8倍的内存。
在Google上我发现C++有std::vector<bool>
。
在numpy中有没有一种方法可以创建一个每个条目只使用1位的布尔数组?
标准的np.bool
类型是1字节,但这样我会使用8倍的内存。
在Google上我发现C++有std::vector<bool>
。
您可以使用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
您想要一个bitarray:
高效的布尔数组 - C扩展
该模块提供了一种对象类型,可有效地表示布尔数组。 Bitarrays是序列类型,并且行为非常类似于通常的列表。八个位用一个字节在连续的内存块中表示。用户可以在两种表示之间选择; 小端和大端。所有功能都是用C实现的。提供了访问机器表示的方法。当需要对二进制文件进行位级访问时,例如便携式位图图像文件(.pbm),这可能非常有用。此外,在处理使用可变位长度编码的压缩数据时,您可能会发现此模块很有用...