【问题标题】:How to determine python array element periodically如何定期确定python数组元素
【发布时间】:2021-12-21 03:35:22
【问题描述】:

我有一个包含一定数量元素的python数组,我想保留5个元素,然后丢弃15个,保留5个,丢弃15个等。

有没有快速的方法来做到这一点?

【问题讨论】:

    标签: python arrays slice


    【解决方案1】:

    下面的解决方案,除了不使用任何导入之外,速度也相当快:

    def skip_elements(l, n1, n2):
        i1 = range(len(l))[::n1+n2]
        i2 = [x + n1 for x in i1]
        return [l[x:y] for x, y in zip(i1, i2)]
    
    test = list(range(1011))
    n_elements_to_keep = 5
    n_elements_to_skip = 15
    
    print(skip_elements(test, n_elements_to_keep, n_elements_to_skip))
    

    如果您需要将结果作为一个列表(而不是列表的列表),您可以更改def skip_elements 中的return 语句,如下所示:

    return sum([l[x:y] for x, y in zip(i1, i2)],[])
    

    无论如何,如果您需要列表列表,这是我所看到的最快的解决方案。反之亦然,如果一个列表是所需的输出,itertools 一个是最好的。尽管非常优雅(我必须承认 - 我投了 +),但列表理解是显示的最慢的。

    【讨论】:

      【解决方案2】:

      您可以使用良好的旧列表理解和enumerate。取模。值 1-5 是模 0-4:

      [v for i,v in enumerate(your_list) if i%(15+5)<5]
      

      例子:

      your_list = list(range(100))
      [v for i,v in enumerate(your_list) if i%20<5]
      

      输出:

      [0, 1, 2, 3, 4, 20, 21, 22, 23, 24, 40, 41, 42, 43, 44, 60, 61, 62, 63, 64, 80, 81, 82, 83, 84]
      

      【讨论】:

      • @user2390182 谢谢,是的,我意识到了;)我也非常喜欢 itertools 解决方案(♥ itertools)
      【解决方案3】:

      您可以使用简单的切片和适当的开始/停止/步进计算:

      arr = list(range(100))
      
      from itertools import chain
      
      take, skip = 5, 15
      list(chain.from_iterable(arr[i:i+take] for i in range(0, len(arr), take+skip)))
      # [0, 1, 2, 3, 4, 
      #  20, 21, 22, 23, 24,
      #  40, 41, 42, 43, 44,
      #  60, 61, 62, 63, 64, 
      #  80, 81, 82, 83, 84]
      

      【讨论】:

        【解决方案4】:

        如果你使用numpy

        鉴于l 是:

        l = np.arange(100)
        

        用途:

        >>> np.split(l, range(5, len(l), 5))[::4]
        [array([0, 1, 2, 3, 4]), array([20, 21, 22, 23, 24]), array([40, 41, 42, 43, 44]), array([60, 61, 62, 63, 64]), array([80, 81, 82, 83, 84])]
        >>> 
        

        对于二维数组而不是一维数组列表,请尝试:

        >>> np.array(np.split(l, range(5, len(l), 5))[::4])
        array([[ 0,  1,  2,  3,  4],
               [20, 21, 22, 23, 24],
               [40, 41, 42, 43, 44],
               [60, 61, 62, 63, 64],
               [80, 81, 82, 83, 84]])
        >>> 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-20
          • 1970-01-01
          • 1970-01-01
          • 2012-05-12
          • 2016-06-21
          • 2011-08-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多