부분은 다음과 같습니다
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,...]
시도해 보셨습니까? – Veedrac
종종이 조작을 * 마지막 * 축에 적용하거나 나중에 사용하는 방법에 따라이 조작을 적용하려는 경우 numpy의 브로드 캐스팅을 활용하고 반복을 모두 피할 수 있습니다 (확실히 빠를 것입니다).). 더 큰 그림을 그리면 우리는 그 방법을 지적 할 수있을 것입니다. – shx2