【问题标题】:How to identify the index that corresponds to a particular ordering of N boolean values in an array?如何识别与数组中 N 个布尔值的特定排序对应的索引?
【发布时间】:2022-11-30 07:43:51
【问题描述】:

假设我执行 n=3 coin-flips,如果抛硬币返回尾巴 (T),则每个 sub_state=True 或如果抛硬币返回正面 (H),则每个 sub_state=False。然后,有 2 ** 3 = 8 可能的 states 因为每个 sub_state 只能接受 2 值(TrueFalse)并且有 3 投币试验。

随便列举的8状态是:

  1. T-T-T
  2. H-T-T
  3. T-H-T
  4. T-T-H
  5. H-H-T
  6. H-T-H
  7. T-H-H
  8. H-H-H

    了解特定系列的抛硬币试验(即 H-T-T)可以揭示当前处于哪个状态。

    我想写一个函数;此函数将sub_states 作为输入,其中sub_states 是大小为n 的布尔数组(即[False, True, True] 对应于H-T-T),并返回相应索引(即2 - 1 = 1)作为输出。

    我不确定如何解决这个问题。我认为可能有办法使用与每个 2**n 状态相对应的二进制数 01 来做到这一点,或者使用 numpy magic 和 itertools 可能是一种更简单的方法。我可以使用哪些途径或方法来解决这个问题?

    import numpy as np
    
    def get_state_index(sub_states):
        """
        Suppose sub_states is a list of
        boolean values of length 3. Then,
        there are 2 ** 3 = 8 possible states.
    
        sub_states = [False, True, True]
        ==> state_index = 1
    
            state 0:
                coin-flips: T-T-T
                sub-states: [True, True, True]
    
            state 1:
                coin-flips: H-T-T
                sub-states: [False, True, True]
    
            state 2:
                coin-flips: T-H-T
                sub-states: [True, False, True]
    
            state 3:
                coin-flips: T-T-H
                sub-states: [True, True, False]
    
            state 4:
                coin-flips: H-H-T
                sub-states: [False, False, True]
    
            state 5:
                coin-flips: H-T-H
                sub-states: [False, True, False]
    
            state 6:
                coin-flips: T-H-H
                sub-states: [True, False, False]
    
            state 7:
                coin-flips: H-H-H
                sub-states: [False, False, False]
        """
        raise ValueError("not yet implemented")
        state_index = ...
        return state_index
    
    if __name__ == '__main__':
    
        ## initialize sub-states
        sub_states = np.full(
            3,
            False,
            dtype=bool)
        sub_states[1] = True
        sub_states[2] = True
    
        ## initialize states
        states = np.full(
            2 ** sub_states.size, # len([True, False]) == 2
            False,
            dtype=bool)
        ##
        # i = get_state_index(sub_states)
        ##
        states[i] = True
        print(states)
    

【问题讨论】:

    标签: python-3.x numpy indexing boolean binary-data


    【解决方案1】:

    少一点随意排序:

    state_index = sum(state * 2 ** pos for pos, state in enumerate(sub_states))
    

    每个False 都算作零,每个True 都算作一。将它们与它们在二进制表示中的位置值相乘,并对结果求和,有效地将它们解释为二进制数(尽管最低有效位优先)。例如[False, False, True]就是0*1 + 0*2 + 1*4,相当于0b100。您还可以通过将每个元素转换为字符串 01,将它们混合在一起,然后将它们解释为二进制来获得相同的结果:

    state_index = int(''.join(str(int(state)) for state in reversed(sub_states)), 2)
    

    reversed 只是为了获得与上面相同的结果,LSB 优先。如果您更喜欢 MSB 优先,请从这个 sn-p 中删除 reversed,或将其添加到前一个。)

    【讨论】:

      猜你喜欢
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      相关资源
      最近更新 更多