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

发布于 2021-01-29 19:14:40

假设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()

我想知道是否有更好的方法。

关注者
0
被浏览
53
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看