2014-12-21 2 views
3

가장/가장 효과적인 방법은 무엇입니까? X가 배열되고, n은 회수되고 함께새 축을 따라 번갈아 반복하는 화살표

난 반복 할 :

np.repeat(x[None,...], n, axis=0) 

또는

ones = [1] * len(x.shape) 
np.tile(x, tuple(n, *ones)) 

주 공지 배열 크기, 후자는 간단하게한다 :

np.tile에 대한 코드의
np.tile(x, (n, 1, 1)) # x is 2D 
+5

시도해 보셨습니까? – Veedrac

+1

종종이 조작을 * 마지막 * 축에 적용하거나 나중에 사용하는 방법에 따라이 조작을 적용하려는 경우 numpy의 브로드 캐스팅을 활용하고 반복을 모두 피할 수 있습니다 (확실히 빠를 것입니다).). 더 큰 그림을 그리면 우리는 그 방법을 지적 할 수있을 것입니다. – shx2

답변

6

부분은 다음과 같습니다

for i, nrep in enumerate(tup): 
    if nrep!=1: 
     c = c.reshape(-1, n).repeat(nrep, 0) 

즉, 축마다 1 회 이상 반복하여 repeat을 수행합니다. 효과, 복수 축에 대한 repeat의 일반화입니다.

그렇기 때문에 타이밍은 비슷할 것으로 예상되지만 일반 repeat은 파이썬 오버 헤드가 적습니다. repeat이 컴파일됩니다. (몇 가지 간단한 테스트가 이것을 확인합니다 - repeat은 작은 배열의 경우 2 배 빠르며 큰 배열의 경우 더 빠름).

p.s. x[None,...] 단계는 비용이 거의 들지 않습니다. 방송으로 인해 모든 것이 필요할 수도 있습니다.


p.s.s. np.lib.index_tricks.as_strided을 사용하면이 반복을 더 빨리 수행 할 수 있습니다. x 모양 (20,50) 대해서는

as_strided(x,shape=(n,20,50),strides=(0,200,4)) 

np.broadcast_arrays 또한 as_strided을 이용한다. 그래서 이것은 똑같은 것을 만들어냅니다 :

np.broadcast_arrays(np.ones((n,1,1)),x)[1] 

솔직히 말해서, 이것은 방송에 대한 정교화이며 진정한 반복이 아닙니다. 데이터가 복제되지 않았습니다. 동일한 값이 단지 n 번 사용됩니다.

브로드 캐스팅을 사용하여 전체 배열을 채울 수 있지만 타이밍은 repeat과 동일합니다. 그것은 repeat가 두포에서 무엇을하고 있을지도 모릅니다.

z = np.empty((300,20,50),dtype=int) 
z[:] = x[None,...] 
+0

'index_tricks'는 모듈에 대한 귀여운 이름입니다. 감사! 슬프게도 아직 정신병 적 모델에 완전히 빠져 들었을 때 감수성이 정말 굉장합니다. –

관련 문제