2013-06-28 4 views
2

배열의 모든 요소에 대한 인덱스 목록을 가져 오려고합니다. 따라서 1000 x 1000 배열의 경우 [(0,0), (0,1), ..., (999,999)]이다. 내가 시간 초과 후에는 (느린 노트북에 부여) 실행하는 데 약 650 밀리 복용되면서배열의 모든 요소에 대한 인덱스를 numpy로 가져 오기

def indices(alist): 
    results = [] 
    ele = alist.size 
    counterx = 0 
    countery = 0 
    x = alist.shape[0] 
    y = alist.shape[1] 
    while counterx < x: 
     while countery < y: 
      results.append((counterx,countery)) 
      countery += 1 
     counterx += 1 
     countery = 0 
    return results 

, 그것은 매우 느린 듯 :

나는 아래 인이 작업을 수행하는 기능을했다. 그래서, 내 평범한 코딩보다 더 빠르게 할 수있는 방법이 있어야합니다 NumPy와를 계산, 나는 문서에보고했다 및 시도 :

indices = [k for k in numpy.ndindex(q.shape)] 
which took about 4.5 SECONDS (wtf?) 
indices = [x for x,i in numpy.ndenumerate(q)] 
better, but 1.5 seconds! 

이 할 수있는 빠른 방법이 있나요?

감사

답변

3

당신은 itertools를 사용하는 줄 알았는데? 그것은 당신의 결과에 대한 반복자를 생성하고, 거의 확실 최적으로 빠르게 될 것입니다 :

import itertools 

a = range(1000) 
b = range(1000) 

product = itertools.product(a, b) 

for x in product: 
    print x 

# (0, 0) 
# (0, 1) 
# ... 
# (999, 999) 

공지 사항이 numpy에 대한 종속성을 필요로하지 않았다. 또한 range을 재미있게 사용하여 0에서 999까지의 목록을 만들 수 있습니다.

+0

좋은 대답 올바른 2D 배열이고 가변 크기 목록 (+1) 목록이 아니라고 가정하면 –

+0

아, 흠. 예. 글쎄, 나는 OP가 물었던 질문에 대답했다. 질문이 좀 더 일반적인 경우 확장 할 수 있습니다. – theJollySin

+0

650ms ~ 326까지 지금 고마워! –

4

np.ndindex?

np.ndindex(1000,1000) 

이는 반복 가능한 객체 반환 : 당신이 배열이있는 경우, 당신은을 통해 인덱스 반복 가능한 구축 할 수 있습니다, 일반적으로

>>> ix = numpy.ndindex(1000,1000) 
>>> next(ix) 
(0, 0) 
>>> next(ix) 
(0, 1) 
>>> next(ix) 
(0, 2) 

을 : 물론

index_iterable = np.ndindex(*arr.shape) 

을 항상 np.ndenumerate있다 또한 다음과 같이 구현할 수 있습니다.

def ndenumerate(arr): 
    for ix in np.ndindex(*arr.shape): 
     yield ix,arr[ix] 
+0

놀고 싶지 않은 호기심에서, OP의 타이밍과 어떻게 비교합니까? – tripleee

관련 문제