查找二进制向量的 "phase"("completion" 的百分比或块中的相对位置)的大多数 pythonic 方法

Most pythonic way of finding the "phase" (percentage of "completion", or relative position in a chunk) of a binary vector

假设我有一个代表两个阶段的二进制向量:

signal = np.array([0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1])

我想为该向量的每个值计算其相对于其块的 "position",例如,以百分比表示,如下所示:

期望输出:

[0, 0.33, 0.66, 0.99, 
 0, 0.5, 1, 
 0, 1, 
 0, 0.33, 0.66, 0.99]

我想知道获得它的最有效或 pythonic 方式是什么。一种方法是来回循环并计算每个 "phase" 的长度,并相应地划分索引,但这似乎很复杂?

非常感谢:)

编写循环并没有什么不符合 Python 风格的,但是如果您绝对必须用推导来做所有事情 itertools,这里有一种方法:

import numpy as np
from itertools import chain, groupby

signal = np.array([0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1])

result = list(chain.from_iterable(
    np.linspace(0, 1, sum(1 for _ in v))
    for _, v in groupby(signal)
))

结果(如果确实需要,请自行取整):

[0.0, 0.3333333333333333, 0.6666666666666666, 1.0,
 0.0, 0.5, 1.0,
 0.0, 1.0,
 0.0, 0.3333333333333333, 0.6666666666666666, 1.0]

解释:

  • groupby(signal) 将连续的 0 或 1 序列分组,
  • sum(1 for _ in v)获取当前序列的长度,
  • np.linspace(0, 1, ...) 创建一个包含从 0 到 1 的均匀间隔数字的长度的数组,
  • list(chain.from_iterable(...)) 将这些数组连接在一起,形成一个列表。