2011-08-07 3 views
5

일부 데이터 분석을 위해 Python과 Numpy를 사용하고 있습니다.3D 배열을 통한 효율적인 반복?

저는 큰 3D 매트릭스 (NxNxN)를 가지고 있습니다. 각 셀은 다시 매트릭스입니다. 이번에는 3x3 매트릭스입니다. 매트릭스 data를 호출, 그것은 다음과 같습니다

data[N,N,N,3,3] 

나는 모든 3 × 3 행렬의 고유 값을 찾을 필요가 있고, 그것을 위해 내가 NumPy와의 eigvals 루틴을 사용하지만, 할 나이 걸립니다. 지금 나는 거의 이것을한다 :

for i in range(N): 
    for j in range(N): 
     for k in range(N): 
      a = np.linalg.eigvals(data[i,j,k,:,:]) 

N = 256의 경우, 약 1 시간 걸린다. 더 효율적으로 만드는 방법에 대한 아이디어가 있습니까?

의견을 보내 주셔서 감사합니다.

+4

프로필을 작성하셨습니까? 나는 당신이 반복하는 것보다 훨씬 더 많은 시간을 eigvals에 소비하고 있다고 생각합니다. – matt

+3

eigvals는 내 timeit 계산으로 약 3 배 더 오래 걸리므로 반복을 변경하면 아무 것도 영향을 미치지 않을 것이라고 생각합니다. – DSM

답변

5

itertools.product은 미학적으로 말하면, 중첩 루프보다 더 좋네요. 하지만 그렇게 빨리 코드를 작성할 것이라고는 생각하지 않습니다. 내 테스트에서는 반복이 병목 현상이 아니라고 제안합니다.

>>> bigdata = numpy.arange(256 * 256 * 256 * 3 * 3).reshape(256, 256, 256, 3, 3) 
>>> %timeit numpy.linalg.eigvals(bigdata[100, 100, 100, :, :]) 
10000 loops, best of 3: 52.6 us per loop 

그래서 과소 평가 :

꽤 새로운 컴퓨터, 14 분 최소의
>>> .000052 * 256 * 256 * 256/60 
14.540253866666665 

. 루프가 얼마나 오래 걸리는 지 봅시다.

>>> def just_loops(N): 
...  for i in xrange(N): 
...   for j in xrange(N): 
...    for k in xrange(N): 
...     pass 
... 
>>> %timeit just_loops(256) 
1 loops, best of 3: 350 ms per loop 

DSM이 말한대로 주문량이 적습니다. 혼자 배열을 자르는 심지어 작업은 더 실질적이다 : 당신이 멀티 코어 프로세서가있는 경우 모든 계산이 독립적

>>> def slice_loops(N, data): 
...  for i in xrange(N): 
...   for j in xrange(N): 
...    for k in xrange(N): 
...     data[i, j, k, :, :] 
... 
>>> %timeit slice_loops(256, bigdata) 
1 loops, best of 3: 33.5 s per loop 
+0

매우 철저한 답변 주셔서 감사합니다! 테스트를 통해 실제로 더 빨리 수행 할 수있는 일이 많지 않은 것처럼 보입니다. – digitaldingo

3

NumPy에서이 작업을 수행하는 좋은 방법이 있지만 일반적으로 itertools.product은 범위에서 중첩 된 루프보다 빠릅니다.

from itertools import product 

for i, j, k in product(xrange(N), xrange(N), xrange(N)): 
    a = np.linalg.eigvals(data[i,j,k,:,:]) 
+0

이 경우 - N은 너무 작기 때문에 실제로 루프 오버 헤드는 중첩 된 범위보다 제품 루프의 두 배 정도 큽니다. 나는 더 평평하고 오버 헤드가 여기 어쨌든 무시할 수 있기 때문에 제품 접근법을 더 좋아한다. – DSM

+0

그건 재미 있어요. 내게는 65536 + 256 개의 내부 목록을 만드는 것이 느려지는 것처럼 보일 것입니다 (비록 내가 큰 차이를 만들지는 몰랐지만). – agf

2

때문에, 당신은 계산 속도를 높이기 위해 다중 모듈을 사용할 수 있습니다.