2014-09-25 8 views
1

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, ... ] 형태로 배열을 병합하는 것입니다.배열의 각 값을 다른 시간에 반복하십시오.

나는 여러 번해야하기 때문에 가능한 한 빨리이 작업을 수행하려고합니다. 저는 파이썬과 numpy를 사용하고 있으며 배열은 numpy.ndarray로 정의되어 있습니다. 나는 주위를 돌아 다니며 , tilecolumn_stack에 대해 알아보고 각 요소를 반복적으로 사용하여 n 번 반복 할 수 있지만 각각 다른 시간을 반복하고 싶었습니다. 이 작업을 수행하는

한 가지 방법은 다음과 같습니다 그것을 할 수있는 더 좋은 방법이 있는지 궁금하고

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

. numpy.repeat이 바로 이러한 작업을 수행하는 것입니다

+0

은 반복 기능입니다. np.repeat? – Kasramvd

+0

@ 카스라 예, 그렇습니다. 나는 그것이 또한 반복을위한 목록을 받아 들인다는 것을 몰랐다. – Amir

+0

그래서'np.repeat'을 작성해야합니다 !!! 귀하의 질문에 대한 유효성 확인 및 취소에주의하십시오 !!! – Kasramvd

답변

8

: 순수 파이썬에서

>>> 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]) 

당신은 같은 작업을 수행 할 수 있습니다

>>> 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

지금까지 가장 효율적인 –

+0

내가 이것을 테스트하지 못했다고 생각할 수 없다. 감사. – Amir

-1

다음은 중첩 된 중첩 된 목록 내재를 사용하는 한 줄짜리 예입니다.

[item for z in [[x]*y for (x,y) in zip(a, s)] for item in z] 
관련 문제