【问题标题】:Finding indices where a jump happens [duplicate]查找发生跳跃的索引[重复]
【发布时间】:2021-05-30 11:56:48
【问题描述】:

所以我有一个单调递增的列表,但有许多重复值。例如,这些是前几个元素:

[0.0, 0.0, 0.0, 0.6931471805599453, 0.6931471805599453, 0.6931471805599453, 0.6931471805599453, 1.0986122886681098, 1.0986122886681098, ...

获取发生跳转的索引列表的有效方法是什么?例如。在这里,2 将是第一个索引。

【问题讨论】:

    标签: python arrays list


    【解决方案1】:

    您可以使用列表解析来做到这一点,enumeratezip

    x = [0.0, 0.0, 0.0, 0.6931471805599453, 0.6931471805599453, 0.6931471805599453, 0.6931471805599453, 1.0986122886681098, 1.0986122886681098]
    
    print([i for i, t in enumerate(zip(x, x[1:])) if t[0] != t[1]])
    
    >>> [2, 6]
    

    基本上,您将列表与自身移动 1 相结合。您只需要两个列表之间的值不同的索引。

    如果你有非常大的列表,那么你可以使用 numpy 模块来做类似的事情。

    import numpy as np
    
    x = np.array([0.0, 0.0, 0.0, 0.6931471805599453, 0.6931471805599453, 0.6931471805599453, 0.6931471805599453, 1.0986122886681098, 1.0986122886681098])
    
    res = np.where(x[:-1] != x[1:])[0]
    print(res)
    
    >>> array([2, 6])
    

    【讨论】:

      【解决方案2】:

      这是一个简单的解决方案:

      jumps = []
      for i in range(len(numbers) - 1):
          if numbers[i] < numbers[i+1]
          jumps.append(i)
      

      然后,如果您想获取列表中跳转处的值,您可以这样做:

      [numbers[i] for i in jumps]
      

      【讨论】:

      • 好的,谢谢。不过,我正在尝试做一个矢量化版本。我的想法类似于 [i if list[i+1] != list[i]] 但这不起作用。
      【解决方案3】:

      使用 numpy,您可以使用 array[:-1] != array[1:]。由于它是矢量化的,它比 python 列表更快。

      方法比较:

      import numpy as np
      numbers  = [0.0, 0.0, 0.0, 0.6931471805599453, 0.6931471805599453, 0.6931471805599453, 0.6931471805599453, 1.0986122886681098, 1.0986122886681098] * 500000
      array = np.array(numbers)
      

      numpy 方法:

      %%time
      ok = (array[:-1] != array[1:])
      jumps = np.where(ok == True)[0]
      

      13.8 毫秒


      @ScootCork 方法:

      %%time
      jumps = [i for i, t in enumerate(zip(numbers, numbers[1:])) if t[0] != t[1]]
      

      374 毫秒


      @Anderson-Amethod:

      %%time
      jumps = []
      for i in range(len(numbers) - 1):
          if numbers[i] < numbers[i+1]:
              jumps.append(i)
      

      505 毫秒


      【讨论】:

        猜你喜欢
        • 2012-09-11
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 2021-08-24
        相关资源
        最近更新 更多