In [52]: alist, reps = [1,2,3,4], [4,3,1,2]
np.repeat 很好地完成了这种重复 - 但它使事物成为数组(这需要时间):
In [53]: np.repeat(alist,reps)
Out[53]: array([1, 1, 1, 1, 2, 2, 2, 3, 4, 4])
列表重复可用于:
In [54]: [[i]*j for i,j in zip([1,2,3,4],[4,3,1,2])]
Out[54]: [[1, 1, 1, 1], [2, 2, 2], [3], [4, 4]]
列表列表可以用以下方式展平:
In [55]: [k for l in ([i]*j for i,j in zip(alist, reps)) for k in l]
Out[55]: [1, 1, 1, 1, 2, 2, 2, 3, 4, 4]
In [56]: list(itertools.chain(*([i]*j for i,j in zip(alist, reps))))
Out[56]: [1, 1, 1, 1, 2, 2, 2, 3, 4, 4]
一些时间安排:
In [57]: timeit np.repeat(alist,reps)
10.9 µs ± 398 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
如果我们从数组开始,结果会快很多:
In [58]: %%timeit a,b = np.array(alist), np.array(reps)
...: np.repeat(a,b)
...:
2.97 µs ± 103 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
但是对于这个小样本,列表方法更快:
In [59]: timeit [k for l in ([i]*j for i,j in zip(alist, reps)) for k in l]
2.33 µs ± 70.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [60]: timeit list(itertools.chain(*([i]*j for i,j in zip(alist, reps))))
2.46 µs ± 76.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
对于较大的情况,我预计 [58] 倍的扩展效果最好。其他的我不确定。