我有一个numpy数组(dtype bool),代表一个比特数组。例如,数组
np.array([True, False, False], dtype=bool)
代表数字4(的确,
bin(4) == 0b100
)。
我想把numpy数组转换为整数(前面例子中的
4
)。
到目前为止,我已经尝试用迭代的方法。
bits = np.array([True, False, False], dtype=bool)
n = 0
for bit in bits:
n = (n << 1) | bit
这种方法确实有效,但我更希望能有一种不遍历数组中每个元素的方法,可能是numpy的内置方法。
我还试着用numpy.packbits
(together with numpy.pad
因为packbits
总是自动向右移动,而不是向左)。
bits = np.array([True, False, False], dtype=bool)
n = np.packbits(np.pad(bits, ((8 - len(bits) % 8) % 8, 0))).item()
这种方法只适用于8个或更少元素的数组。事实上,如果你试图使用一个更长的数组,你最终会有多个结果(因为显然packbits
不仅向右移位,而且还将每一个字节转换为数字)。
bits = np.array(
[True, False, False, False, False, False, False, False, False],
dtype=bool,
n = np.packbits(np.pad(bits, ((8 - len(bits) % 8) % 8, 0)))
print(n) # this prints [1 0], but I need it to return 256
预期的行为。
np.array([True, True], dtype=bool) --> 3
np.array([True, True, False], dtype=bool) --> 6
np.array([True, False, False, True, True], dtype=bool) --> 19
np.array([True, False, False, False, False,
False, False, True, False, False], dtype=bool) --> 516