2017-03-21 2 views
-2

그래서, 나는 엄청난 배열 (1000 만 개 이상의 요소 이상)을 가지고 있습니다. 그런 다음 큰 배열에 액세스하는 루프가 있습니다.Numpy 배열 액세스 최적화

매 반복마다 루프는 인접 인덱스 목록을 통해 numpy 배열에서 값을 검색합니다. 현재 큰 배열의 조각을 취한 다음 값을 검색합니다. 예를 들어

: 루프는 array[1000:1003, 999 : 1001]의 조각을 다음 요소에 액세스 [1000, 1000], [1001, 1000], [1002,999] 액세스 할 필요가있다.

루프의 성능이 저하되거나 이론적으로 증가합니까?

+1

직접 확인하지 못하게되어 "이론"에 대해 걱정할 필요가없고 대신 "현실"에 만족할 수 있습니까? 조금 더 많은 정보/연구를 통해 좋은 질문이 될 수 있습니다. –

답변

1

내가 기억하는 것으로부터 슬라이스는 목록 부분을 메모리에 복사하는 것으로 끝납니다. 확실하지는 않지만이 작업이 O (1) 인 것으로 거의 확신합니다. 그러나 직접 acessing,

container = [] for i in range(a,b): container.append(l[i])

처럼 그것은 일반적으로 빠르다.

1

arr1 = arr[1000:1003, 999 : 1001]viewarr입니다. 즉, 모양과 스트라이드가있는 새로운 배열 객체이지만 데이터 버퍼는 arr과 공유됩니다. (나는 '주'하지만 난 여기에 문제를 생각하지 않는 방법에 대한 세부 사항을 얻을 수 있습니다.)

arr[1000, 1000], arr[1001, 1000], arr[1002,999]arr의 개별 요소입니다. arr1[0,1], arr1[1,1], arr1[2,0] 같은 요소를 참조하십시오 (수학을 올바르게 수행 한 경우). 제 생각에 접근 시간은 같을 것입니다.

그 세 가지 요소

arr2 = arr[[1000, 1001, 1002],[1000, 1000, 999]] 

으로, 하나 개의 사본으로, 한 번에 가져올 수 있었다 나는 기대

for x in arr: 
    <do something with x> 

보다 빠른

for idx in [[1000, 1000], [1001, 1000], [1002,999]]: 
    x = arr[idx] 
    <do something with x> 

될 것입니다 그러나 그것은 가능성이 있음 '무언가'의 시간은 색인 시간을 초과 할 것입니다.

하지만 테스트 케이스를 설정하고 다른 방법을 시도해 보시기 바랍니다. 차이점을 직접 확인하십시오.