我正在尝试使用 numpy 将几个掩码( bool 数组)转换为一个位掩码,虽然理论上可行,但我觉得我做了太多操作。
例如创建我使用的位掩码:
import numpy as np
flags = [
np.array([True, False, False]),
np.array([False, True, False]),
np.array([False, True, False])
]
flag_bits = np.zeros(3, dtype=np.int8)
for idx, flag in enumerate(flags):
flag_bits += flag.astype(np.int8) << idx # equivalent to flag * 2 ** idx
这给了我预期的“位掩码”:
>>> flag_bits
array([1, 6, 0], dtype=int8)
>>> [np.binary_repr(bit, width=7) for bit in flag_bits]
['0000001', '0000110', '0000000']
但是我觉得特别是 int8
的转换和 flag_bits
数组的加法太复杂了。因此,我想问一下,是否有任何我遗漏的 NumPy 功能可用于创建这样的“位掩码”数组?
注意:我正在调用一个需要这样一个位掩码的外部函数,否则我会坚持使用 bool 数组。
最佳答案
>>> x = np.array(2**i for i in range(1, np.shape(flags)[1]+1))
>>> np.dot(flags, x)
array([1, 2, 2])
工作原理:在位掩码中,每一位实际上都是原始数组元素根据其位置乘以 2 的次数,例如4 = 假 * 1 + 真 * 2 + 假 * 4
。实际上,这可以表示为矩阵乘法,这在 numpy 中非常有效。
因此,第一行是创建这些权重的列表理解:x = [1, 2, 4, 8, ... 2^(n+1)]。
然后,flags 中的每一行都乘以 x 中的相应元素,然后将所有内容相加(这就是矩阵乘法的工作原理)。最后,我们得到位掩码
关于python - 从几个 bool numpy 数组创建 "bitmask",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42058057/