python - 从几个 bool numpy 数组创建 "bitmask"

标签 python numpy

我正在尝试使用 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/

相关文章:

python - Pandas :在一组中使用多个功能

python - 用于计算大型数据帧的更快的函数或脚本

python - 使用Python 2.7打印字符串变量中的颜色字符

python - 加速将概率转化为二进制特征

python - Numpy:对多个数组进行花式索引

python - 使用配置文件控制树莓派 gpio

python - 检查 float 是否接近存储在数组中的任何 float

用于小数字的 Python numpy linspace

python - 将数组拆分为预测矩阵和响应向量

python - 如何以不同的起点对np数组特定维度进行切片?