【问题标题】:Count number of consecutive elements in a list [duplicate]计算列表中连续元素的数量[重复]
【发布时间】:2019-03-13 11:47:49
【问题描述】:

我有一个像这样的 numpy 数组:

array([100, 100, 100, 100, 100, 200, 100, 100, 100, 100, 100, 100, 100,
    100, 200, 100, 100, 100, 100, 100, 100, 100, 100, 200, 100, 100,
    100, 100, 100, 100, 100, 200, 100, 100, 100, 100, 100, 100, 100,
    100, 200, 100, 100, 100, 100, 100, 100, 100, 100, 200, 100, 100,
    100, 100, 100, 100, 100, 300, 100, 100, 100])

我需要计算“100”个元素的连续数量。 '100' 元素由大于 100 的值分隔。

输出应如下所示:

[5,8,8,7,8,8,7,3]

【问题讨论】:

  • 使用 for 循环将计数附加到列表中 for i in c: if(i == 100): count += 1 list.append(count)
  • 您可以使用np.where() 找到具有值的 idx,然后将结果数组拆分为具有连续整数的子数组(c.f. *.com/questions/2361945/…),最后取每个子数组的长度-数组。

标签: python numpy


【解决方案1】:

这是一个简单的python脚本:

arr = [100, 100, 100, 100, 100, 200, 100, 100, 100, 100, 100, 100, 100,
    100, 200, 100, 100, 100, 100, 100, 100, 100, 100, 200, 100, 100,
    100, 100, 100, 100, 100, 200, 100, 100, 100, 100, 100, 100, 100,
    100, 200, 100, 100, 100, 100, 100, 100, 100, 100, 200, 100, 100,
    100, 100, 100, 100, 100, 300, 100, 100, 100]

check = arr[0]
result = []
count = 0
for el in arr:
    if el == check:
        count+=1
    else:
        check = el
        if count>1:
            result.append(count)
        count = 1
result.append(count)

print(result)
[5, 8, 8, 7, 8, 8, 7, 3]

【讨论】:

    【解决方案2】:

    这是在this 帖子中改编@Jaime 解决方案的方法:

    a = np.array([100, 100, 100, 100, 100, 200, 100, 100, 100, 100, 100, 100, 100,
    100, 200, 100, 100, 100, 100, 100, 100, 100, 100, 200, 100, 100,
    100, 100, 100, 100, 100, 200, 100, 100, 100, 100, 100, 100, 100,
    100, 200, 100, 100, 100, 100, 100, 100, 100, 100, 200, 100, 100,
    100, 100, 100, 100, 100, 300, 100, 100, 100])
    
    c = a == 100
    np.diff(np.where(np.concatenate(([c[0]], c[:-1] != c[1:], [True])))[0])[::2]
    # array([5, 8, 8, 7, 8, 8, 7, 3])
    

    【讨论】:

      【解决方案3】:

      将 numpy 数组转换成这样的列表:

      a = [100, 100, 100, 100, 100, 200, 100, 100, 100, 100, 100, 100, 100, 100, 200, 100, 100, 100, 100, 100, 100, 100, 100, 200, 100, 100, 100, 100, 100, 100, 100, 200, 100, 100, 100, 100, 100, 100, 100, 100, 200, 100, 100, 100, 100, 100, 100, 100, 100, 200, 100, 100, 100, 100, 100, 100, 100, 300, 100, 100, 100]
      

      试试:

      from itertools import groupby
      b = [sum(1 for i in g) for k,g in groupby(a) if k==100]
      

      输出

      b = [5, 8, 8, 7, 8, 8, 7, 3]
      

      【讨论】: