2013-05-16 1 views
5

나는 큰 3 차원 배열을 numpy로 갖는다. (크기를 100x100x100으로 말하게하자.) 여러 번 (요소의 약 70 %) 여러 부분을 반복하고 싶습니다. 그리고 같은 크기의 부울 행렬을 가지며 요소가 작업을 완료해야하는지 여부를 정의합니다.numpy 배열의 일부에 대한 반복 속도를 높이는 방법

내 현재의 방법은 형상의 배열 "좌표"(N, 3)의 동작을 수행하도록하고

for i in np.arange(many_iterations): 
    for j in coords: 
     large_array[j] = do_something(large_array[tuple(j)]) 

그것이 실제로 나을되는 모든 좌표가 포함 만드는 제이고 전체 배열을 평가하고 부울 배열을 테스트하기 위해 루프에 추가 연산을 포함시킵니다 (진리 평가는 한번에 여러 번 반복됩니다). 내 생각으로는이 경우에 보수가 for 루프를 없애는 것입니다.

large_array = do_something(large_array if condition True) 

이 경우 마지막 줄을 어떻게 만들 수 있습니까?

+0

'do_something '이 무엇인가에 따라'large_array [boolean_array] = do_something (large_array [boolean_array])'또는 좀 더 짧게 할 수 있습니다. –

+0

당신의 감정이 옳다고 생각합니다. 전체 어레이에서 작업을 수행 한 다음'numpy.where'와 같은 것을 사용하면 이익이 될 것입니다. –

답변

3

먼저 당신이 작동해야 위치를 정의 논리 값의 배열을 생성하여 더 나은 성능을 얻을 수 있습니다 :

같은
big_3d_arr = some 100x100x100 array 
where_to_operate_arr = big_3d_arr < 500 # or whatever your condition is 
big_3d_arr[where_to_operate_arr] = do_something(big_3d_arr[where_to_operate_arr]) 

뭔가가 작동하지 않을 수 있습니다,하지만 다시는 반복해야하고 덩어리에서 부울 인덱싱을 할 수 있습니다 , 귀하의 응용 프로그램에 따라.

+0

감사합니다. 이것이 내가 필요한 것입니다. do_something은 배열의 각 요소를 가져 와서 주변 요소의 평균으로 만드는 함수입니다 (배열을 복사하고 일련의 np.roll을 사용하여 배열을 오프셋 및 추가합니다). 마스크 된 데이터를 사용하고 있으므로이 솔루션보다 조금 복잡해 보였으므로 결국 마스크를 사용하기로 결정했습니다. – Rowan

3

기본적으로 masked arrays을 다시 만들려고합니다. This 페이지는 좋은 소개를 제공합니다.

관련 문제