如何定期确定python数组元素



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

有快速的方法吗?

您可以使用良好的旧列表理解和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]

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

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]

如果使用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])]
>>> 

对于2d数组而不是1d数组列表,请尝试:

>>> 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]])
>>> 

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

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列表是最好的。尽管很优雅(我必须承认,我投了+票(,但列表理解能力是显示的列表中最慢的。

最新更新