重复数组的每个值不同的时间
假设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。我周围中搜索和了解repeat
,tile
并column_stack
能很好地被用来重复每个元素n
次,但我想每个人重复不同的时间。
一种方法是:
a = hsplit(a, 6)
for i in range(len(a)):
a[i] = repeat(a[i], s[i])
a = a.flatten()
我想知道是否有更好的方法。
-
这就是
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