将一个numpy bool数组转换为int

1 人关注

我有一个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
    
1 个评论
我认为最后一个是516(512+4)而不是518。
python
arrays
numpy
bit-manipulation
Riccardo Bucco
Riccardo Bucco
发布于 2022-04-01
2 个回答
Jérôme Richard
Jérôme Richard
发布于 2022-04-01
已采纳
0 人赞同

你可以通过从最大的一个开始生成2的幂(例如: [16, 8, 4, 2, 1] )来解决这个问题,然后在做最后的和之前乘以 bits

powers = 1 << np.arange(bits.size, dtype=np.uint64)[::-1]
result = np.sum(powers * bits)

这相当于在做。2**n * bits[0] + 2**(n-1) * bits[1] + ... + 2**0 * bits[n]。 请注意,最终的数值需要符合64位的要求。

LeonardoVaz
LeonardoVaz
发布于 2022-04-01
0 人赞同

Try using numpy.logspace :

import numpy as np
bits = np.array([True, False, False, False, False, False, False, False, False],dtype=bool,)
bits=bits[::-1]
result = np.sum(np.logspace(0, bits.size-1, num=bits.size, base=2) * bits, dtype=np.int)