簡體   English   中英

在Python中創建包含n個重復項列表的列表的數組

[英]Create array containing list of lists of n repeated items in Python

我嘗試找到一種創建此類列表的更快方法:

import numpy as np
values = [0,1,2]
repeat = [3,4,2]
list = np.empty(0, dtype=int)
for i in range(len(values)):
    list = np.append(list, np.full(repeat[i], values[i]))
print list

回報

[0 0 0 1 1 1 1 2 2]

任何想法? 謝謝

您可以使用本地python列表而不是numpy數組來節省大量時間。 當我使用timeit模塊運行您的代碼時,花了16.87秒。 以下代碼為0.87。

list = []
for val, rep in zip(values, repeat):
    list.extend([val]*rep)

如果隨后使用list = np.array(list)將list轉換為numpy數組,則該時間最多為2.09秒。

當然,由於numpy針對大量數據進行了優化 ,因此對於包含大量重復項的非常長的值列表而言,這可能不成立。 在這種情況下,一種替代方法是同時進行所有內存分配,而不是連續加長數組(我認為這會秘密地導致進行復制 ,這很慢)。 下面的示例在4.44秒內完成。

list = np.empty(sum(repeat), dtype=int) #allocate the full length
i=0 #start the index at 0
for val, rep in zip (values, repeat):
    list[i:i+rep] = [val]*rep #replace the slice
    i+=rep #update the index

你可以試試看 對於每對值和長度,將值列表乘以長度。
您將獲得列表列表

L = [[i]*j for i, j in zip(values, repeat)] 
print(L)

回報

[[0, 0, 0], [1, 1, 1, 1], [2, 2]]

比定一個清單

flat_L = [item for sublist in L for item in sublist] 
print(flat_L)
[0, 0, 0, 1, 1, 1, 1, 2, 2]

我會這樣:

a=[1,2,3]
b=[2,4,3]
x=[[y]*cnt_b for cnt_b,y in zip(b,a)]

輸出:

[[1,1],[2,2,2,2],[3,3,3]

In [8]: [i for i, j in zip(values, repeat) for _ in range(j)]
Out[8]: [0, 0, 0, 1, 1, 1, 1, 2, 2]

在這里,我們正在壓縮值,並與zip一起重復以使它們之間具有一對一的對應關系(例如[(0,3),(1,4),(2,2)])。 現在,在列表理解中,我將插入i或值,並將它們循環遍歷j的范圍以將其重復j次。

暫無
暫無

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

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