查找二进制向量的 "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(...))
将这些数组连接在一起,形成一个列表。
假设我有一个代表两个阶段的二进制向量:
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(...))
将这些数组连接在一起,形成一个列表。