gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:05:47 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com