重复一个数组中的每个值不同的次数

13
假设 a = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6] 并且 s = [3, 3, 9, 3, 6, 3]。我想要寻找一种最佳的方法,用s[i]精确重复a[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。我搜索了一下,发现了可以很好地用于将每个元素重复n次的repeattilecolumn_stack,但我希望对它们每个都进行不同的重复。
其中一种方法是:
a = hsplit(a, 6)
for i in range(len(a)):
    a[i] = repeat(a[i], s[i])
a = a.flatten()

我在想是否有更好的方法来做这件事。


你的重复函数是 np.repeat? 吗? - Mazdak
@Kasra 是的,没错。我不知道它也接受重复列表。 - Amir
所以你必须写 np.repeat !!! 请注意你的问题验证和清晰 !!! - Mazdak
你是对的,我测试了很多次但是我错过了这个。抱歉。 - Amir
2个回答

23

这正是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

3
迄今为止最有效的。 - Padraic Cunningham
我简直不敢相信我没有测试这个。谢谢。 - Amir

0
这是一个只使用(嵌套)列表推导式的一行代码:
[item for z in [[x]*y for (x,y) in zip(a, s)] for item in z]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接