首页 > 解决方案 > 基于值将列表的部分分组为多个列表的 Pythonic 方式

问题描述

下面是我制作的图,其中 y 轴 (v) 是列表中包含的值。如您所见,列表值在高值段和低值段之间交替,使得列表如下所示:

li = [0.5,0.49,0.5,..,0.5,0.001,0.001,...,0.001,0.49,0.5,...,0.5,]

我的目标是取高值的六个段中的每一个和低值的六个段中的每一个,然后计算每个段的平均值。为此,我试图将上面的列表分开并将每个段放入自己的列表中,并将每个列表放入相应的高值/低值列表中。类似于以下内容:

high_segments = [[high_values1],[high_values2],[high_values3]]
low_segments  = [[low_values1],[low_values2],[low_values3]]

我一直在尝试构建一个 for 循环来做到这一点,但一直在努力解决如何处理低值组和高值组之间的变化。非常感谢任何建议。

电压与时间

标签: pythonlistfor-looplist-comprehension

解决方案


使用numpy和平均分割。

import numpy as np

li = np.array([
    0.5, 0.49, 0.5,
    0.001, 0.001, 0.001,
    0.49, 0.5, 0.5,
    0, 0.002, 0.01,
])

# Split into high/low groups using the mean:
is_high = li >= li.mean()
is_low = li < li.mean()

# Determine the groups:
diff = np.insert(np.diff(is_high), 0, False).astype(np.int)  # array([0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0])
groups = diff.cumsum()  # array([0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3])

high_segments = np.array([li[groups==kk] for kk in np.unique(groups[is_high])])
low_segments = np.array([li[groups==kk] for kk in np.unique(groups[is_low])])

high_segments_mean = high_segments.mean(axis=1)
low_segments_mean = low_segments.mean(axis=1)

推荐阅读