【问题标题】:How to find the longest consecutive subsequence of a list greater than mean in python如何在python中找到大于平均值的列表的最长连续子序列
【发布时间】:2020-01-07 07:36:55
【问题描述】:

我想找到一个列表中最长连续子序列的长度,该子序列的值大于其平均值。

例如,考虑下面的例子。

mylist = [0, 6, 25, 20, 15, 8, 15, 6, 0, 6, 0]

以上列表的平均值为 9.181818181818182。所以,最长的连续子序列是[25,20,15]。因此,长度为 3。

我尝试如下。

mytemp = []
for item in mylist:
    if item > np.mean(mylist).item():
        mytemp.append(1)
    else:
        mytemp.append(0)
print(mytemp)

但是,这对于长数据集来说效率很低,因为我正在创建另一个数组来执行此操作。我想知道在 python 中是否有更有效的方法来做到这一点。

如果需要,我很乐意提供更多详细信息。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    使用 NumPy 数组和函数来提高效率 -

    a = np.array(mylist)
    m = np.r_[False,a>a.mean(),False]
    idx = np.flatnonzero(m[:-1]!=m[1:])
    largest_island_len = (idx[1::2]-idx[::2]).max()
    

    如果你也需要这些元素 -

    I = (idx[1::2]-idx[::2]).argmax()
    elems = a[idx[2*I]:idx[2*I+1]]
    

    【讨论】:

    • 只是想知道为什么我输入[-10,-10,0,0,0,0]时代码不起作用
    • @EmJ 也适用于此。你如何使用它? a = np.array([-10,-10,0,0,0,0]) 然后使用发布的代码?答案是 4 0s
    • 我又试了一次。那行得通。对不起。我认为问题出在我代码的其他部分。非常感谢:)
    【解决方案2】:

    你能用filter函数吗?

    例如

    mean = sum(mylist)/len(mylist)
    mytemp = filter(lambda x: x > mean, mylist)
    

    为了提高程序的速度,您可能需要考虑使用 C/C++/Fortran 库(例如 numpy),也许是提供 GPU 加速的库(例如 tensorflow、pytorch)。

    【讨论】:

    • 感谢您的回答。但是,我得到的结果为 [25, 20, 15, 15]。因为,我正在考虑连续序列,它应该是 [25, 20, 15]。
    【解决方案3】:

    只有标准库:

    from itertools import groupby
    from statistics import mean
    mylist=[0, 6, 25, 20, 15, 8, 15, 6, 0, 6, 0]
    m=mean(mylist)
    mylist=[tuple(x) for b,x in groupby(mylist,key=lambda x:x>m) if b]
    print(max(mylist,key=len))
    

    它搜索高于和低于或等于的运行。比保持上面得到它的长度并只打印最大长度的那个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 2012-11-08
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多