如何从多个布尔子状态数组生成仅单元素为True的布尔状态数组?
解决方案
你需要将拼接后的布尔数组转换为对应的二进制整数索引,核心思路是给每个布尔位分配对应的2的幂次权重,再求和得到目标索引。
实现代码
import numpy as np def get_state_index(sub_states): # 拼接所有子状态为一维布尔数组 concatenated = np.concatenate(sub_states) # 生成每个位置对应的权重:第i位对应2^i weights = 2 ** np.arange(concatenated.size) # 计算索引:布尔值转整数后乘以权重,求和 state_index = np.sum(concatenated.astype(int) * weights) return state_index
验证示例
用你提供的测试数据验证:
sub_state_a = np.array([False]) sub_state_b = np.array([True]) sub_state_c = np.array([True]) sub_states = [sub_state_a, sub_state_b, sub_state_c] index = get_state_index(sub_states) print(index) # 输出:6,对应二进制0b110,即第2、3位为True(从0开始计数)
逻辑说明
- 拼接后的布尔数组每个元素对应二进制的一位,第一个元素是最低位(权重20),最后一个元素是最高位(权重2(n-1)),完全匹配你描述的规则:
- 全False时,所有位为0,索引=0
- 仅第一个元素为True时,索引=2^0=1
- 仅第二个元素为True时,索引=2^1=2
- 以此类推
优化提示
如果子状态数量较多(比如超过20个),2**np.arange()可能会溢出,此时可以改用np.left_shift或者直接用np.packbits结合字节转换,但对于游戏智能体的常规状态数量,上述方法足够高效。
内容的提问来源于stack exchange,提问作者HeartZoom
相关产品推荐
相关产品推荐

