簡體   English   中英

如何定期確定python數組元素

[英]How to determine python array element periodically

我有一個包含一定數量元素的 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])]
>>> 

對於二維數組而不是一維數組列表,請嘗試:

>>> 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_elementsreturn語句:

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

無論如何,如果您需要列表列表,這是我所看到的最快的解決方案。 反之亦然,如果一個列表是所需的輸出,那么itertools是最好的。 盡管非常優雅(我必須承認 - 我投了 +),但列表理解是顯示的列表理解中最慢的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM