问题描述
假设 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,...]
。
Suppose a = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]
and s = [3, 3, 9, 3, 6, 3]
. I'm looking for the best way to repeat a[i]
exactly s[i]
times and then have a flatten array in the form of 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。我四处搜寻,并了解重复
,瓷砖
和 column_stack
它可以很好地用于 N
次重复每一个元素,但我想他们每个人重复不同的时间。
I want to do this as fast as possible since I have to do it many times. I'm using Python and numpy and the arrays are defined as numpy.ndarray. I searched around and find out about repeat
, tile
and column_stack
which can be used nicely to repeat each element n
times but I wanted to repeat each of them different times.
做到这一点的方法之一是:
One way to do this is:
a = hsplit(a, 6)
for i in range(len(a)):
a[i] = repeat(a[i], s[i])
a = a.flatten()
我想知道是否有更好的方法来做到这一点。
I am wondering if there is a better way to do it.
推荐答案
这正是的做:
That's exactly what numpy.repeat
does:
>>> 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,你可以这样做:
In pure Python you can do something like:
>>> 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的等效的:
But of course it is going to be way slower than its NumPy equivalent:
>>> 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
这篇关于重复的阵列的不同时间的每个值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!