我有一個包含一定數量元素的 python 陣列,我想保留 5 個元素,然后丟棄 15 個,保留 5 個,丟棄 15 個等等。
有沒有快速的方法來做到這一點?
uj5u.com熱心網友回復:
您可以使用一個很好的舊串列理解和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]
uj5u.com熱心網友回復:
您可以使用簡單的切片和適當的開始/停止/步驟計算:
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]
uj5u.com熱心網友回復:
如果您使用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]])
>>>
uj5u.com熱心網友回復:
以下解決方案,除了不使用任何匯入外,也相當快:
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))
如果您需要將結果作為一個串列(而不是串列串列),您可以按如下方式更改return陳述句def skip_elements:
return sum([l[x:y] for x, y in zip(i1, i2)],[])
無論如何,如果您需要串列串列,這是我所看到的最快的解決方案。反之亦然,如果一個串列是所需的輸出,那么itertools一個是最好的。盡管非常優雅(我必須承認 - 我投了 ),但串列理解是顯示的串列理解中最慢的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/352606.html
