不同时间重复数组的每个值

时间:2014-09-25 12:32:48

标签: python arrays numpy

假设a = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]s = [3, 3, 9, 3, 6, 3]。我正在寻找以a[i]完全重复s[i]次的最佳方式,然后以b = [0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.3, 0.3, 0.3, 0.3, ... ]的形式展示一个展平数组。

我想尽快做到这一点,因为我必须多次这样做。我使用Python和numpy,数组定义为numpy.ndarray。我四处搜索了解repeattilecolumn_stack,可以很好地重复每个元素n次,但我想重复不同的时间。

一种方法是:

a = hsplit(a, 6)
for i in range(len(a)):
    a[i] = repeat(a[i], s[i])
a = a.flatten()

我想知道是否有更好的方法来做到这一点。

2 个答案:

答案 0 :(得分:10)

这正是numpy.repeat的作用:

>>> a = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6])
>>> s = np.array([3, 3, 9, 3, 6, 3])
>>> np.repeat(a, s)
array([ 0.1,  0.1,  0.1,  0.2,  0.2,  0.2,  0.3,  0.3,  0.3,  0.3,  0.3,
        0.3,  0.3,  0.3,  0.3,  0.4,  0.4,  0.4,  0.5,  0.5,  0.5,  0.5,
        0.5,  0.5,  0.6,  0.6,  0.6])

在纯Python中,您可以执行以下操作:

>>> from itertools import repeat, chain, imap
>>> list(chain.from_iterable(imap(repeat, a, s)))
[0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.4, 0.4, 0.4, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.6, 0.6, 0.6]

但当然它会比NumPy等价物慢:

>>> s = [3, 3, 9, 3, 6, 3]*1000
>>> a = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]*1000
>>> %timeit list(chain.from_iterable(imap(repeat, a, s)))
1000 loops, best of 3: 1.21 ms per loop
>>> %timeit np.repeat(a_a, s_a) #a_a and s_a are NumPy arrays of same size as a and b
10000 loops, best of 3: 202 µs per loop

答案 1 :(得分:0)

这里是仅使用(嵌套)列表推导的单行:

[item for z in [[x]*y for (x,y) in zip(a, s)] for item in z]