用Python分组系列

Tho*_*mas 6 python matplotlib

标题编辑:固定大写并添加'for python'.

有没有更好或更标准的方式来做我正在描述的事情?我想要这样的输入:

[1, 1, 1, 0, 2, 2, 0, 2, 2, 0, 0, 3, 3, 0, 1, 1, 1, 1, 1, 2, 2, 2]

转化为这个:

[0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2, 0]

或者更好的是,这样的东西(描述类似的输出不同,但现在不限于整数):

标签: [1, 2, 3, 1, 2]

位置(其中1表示第一个占用位置,根据我的matplotlib图): [2, 7, 12.5, 17, 21]

输入数据是分类图的分类数据 - 在下图中,分组图共享一个分类特征,我只想为该组标记一次.我将使用2个轴作为两个不同的变量,但我认为这是现在的重点.

注意:此图像不反映任何一组样本数据 - 它只是为了实现将类别分组在一起的想法.组a应标记为x = 5,因为在前两个和第二个垂直数据组之间有一个空格,0是右侧的一行.

图像显示了刻度标记在数据类别中心的位置

这是我得到的:

data = [1, 1, 1, 2, 2, 2, 2, 2, 3, 4, 3, 2, 2, 1, 1, 1, 1]
last = None
runs = []
labels = []
run = 1
for x in data:
    if x in (last, 0):
        run += 1
    else:
        runs.append(run)
        run = 1
        labels.append(x)
    last = x
runs.append(run)
runs.pop(0)
labels.append(x)
tick_positions = [0]
last_run = 1
for run in runs:
    tick_positions.append(run/2.0+last_run/2.0+tick_positions[-1])
    last_run = run
tick_positions.pop(0)
print tick_positions
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 8

要获取标签,您可以使用itertools groupby:

>>> import itertools
>>> numbers = [1, 1, 1, 0, 2, 2, 0, 2, 2, 0, 0, 3, 3, 0, 1, 1, 1, 1, 1, 2, 2, 2]
>>> list(k for k, g in itertools.groupby(numbers))
[1, 0, 2, 0, 2, 0, 3, 0, 1, 2]
Run Code Online (Sandbox Code Playgroud)

要删除零,您可以使用理解:

>>> list(k for k, g in itertools.groupby(x for x in numbers if x != 0))
[1, 2, 3, 1, 2]
Run Code Online (Sandbox Code Playgroud)

如果你想获得这些职位,那么你将不得不像你现在一样自己遍历这个职位.groupby不跟踪你的情况.

  • 1)位置也很重要2)两个"2"序列之间的"0"也应该被忽略.我想没有选择,但以某种方式生成该中间数组,只是将所有重复值分组是不够的. (2认同)