繁体   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