将 numpy bool 数组转换为 int
Convert a numpy bool array to int
我有一个代表位数组的 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
尝试使用 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)
这输出:
print(result)
256
你可以通过从最大的一个开始生成两个的幂(例如[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 位。
我有一个代表位数组的 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
尝试使用 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)
这输出:
print(result)
256
你可以通过从最大的一个开始生成两个的幂(例如[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 位。