2014-04-09 2 views
5

에서 키의 임의 선택 나는 N 값이 ARR라는 거 np.array을 가지고에 의해 무작위로이 값의 10 %를 선택합니다.반전 NumPy와 배열

사실 저는 90 %의 값을 가진 배열이 필요합니다. 그래서 지금 나는 매우 느린 다음을 사용합니다 :

def buildRevChoice(choice, nevents): 
     revChoice=[] 
     for i in range(N): 
      if not i in choice: 
       revChoice.append(i) 
     return revChoice 

이것을 고정시키는 방법을 생각해 볼 수 있습니까?

+0

빠른 최적화 :'buildRevChoice'에서 조회 속도를 높이기 위해'choice'에서'set'을 만듭니다. –

+1

성능이 필요한 경우 큰 배열에 파이썬 루프를 사용하지 마십시오. 파이썬/numpy의 함수 프로그래밍과 numpy의 벡터화를 사용하십시오. –

+0

예 알아 두었지만 Google별로 다른 솔루션을 찾지 못했습니다. 합리적인 검색 구문을 생각할 수 없었습니다. – user575736

답변

6

그냥 random.shuffle 목록을 작성한 다음 원하는대로 분할 할 수 있습니다.

def choice(N, percent): 
    tmp = range(N) 
    random.shuffle(tmp) 
    cut = int(N * percent) 
    return tmp[:cut], tmp[cut:] 

그리고 당신은 당신의 두 목록을 얻을 것이다, 선택된 사람과 나머지를 포함하는 두 번째를 포함하는 첫 번째.

+2

나쁜 해결책이 아닙니다. random.shuffle의 성능에 대해서는 조심 스럽지만. 잠재적으로 random.permutation이 더 나은 성능을 보입니다. 그리고 구현 방법에 따라 np.argsort (random.randint())가 여전히 순열 색인을 생성하는 더 빠른 방법 일 수 있습니다. –

+0

@EelcoHoogendoorn 나는'numpy'를 사용하지 않았기 때문에, 내가 아는 것은 모두 기본적인 파이썬이다. O (n) Fisher Yates Shuffle 알고리듬은 잘 어울리지 않을까? – 0605002

+0

C 확장을 작성할 계획이 아니라면 직접 구현하는 알고리즘은 나쁜 선택입니다. 내가 벤치마킹 한 셔플에 대해 알아 두십시오. 난 가장 임의의 장소에서 셔플 알고리즘이 반드시 가장 효율적인 것은 아니라고 상상해보십시오. –

2

마스크 배열의 메모리 오버 헤드로 괜찮 으면 인덱스로 다른 값을 선택하는 것보다 빠르며 요소 순서는 are으로 유지합니다. 여기에 내가 IPython 노트북에서 타이밍과 무엇을 가지고 있습니다 :

N = 2000000 
arr = random.random(N) 
percent = 0.10 

내 솔루션 :

%% timeit 
choice = random.choice(N, N*percent) 
mask = zeros_like(arr, bool) 
mask[choice] = True 
newarr = arr[mask] 
revchoice = arr[~mask] 

10 루프, 3 최고 : 루프 당 18.1 MS

0605002의 솔루션 :

tmp = range(N) 
random.shuffle(tmp) 
cut = int(N * percent) 
newarr, revchoice = tmp[:cut], tmp[cut:] 

루프 당 1 개, 루프 당 최대 3 : 603 ms

+0

대단히 감사합니다. 그것은 두 가지 좋은 해결책입니다. 어느 것이 더 빠르는지 확인해 드리겠습니다. 나는 기억 문제에 익숙하지 않다. 어떤 경우 마스크를 사용하지 않아야합니까? – user575736

+1

이 솔루션 (및 다른 하나는 0605002)은 'arr'과 같은 크기의 배열을 사용합니다. 따라서 배열이 사용 가능한 메모리 크기의 절반이면 마스크를 만들 충분한 공간이 없습니다. 마스크를 작성하지 않으면 색인 배열에 대해 10 % 더 많은 메모리를 확보 할 수 있습니다. 2 백만 포인트는 그렇게 많지 않습니다. – chthonicdaemon

+1

답을 타이밍으로 업데이트했습니다. 내 솔루션은 더 빠른 속도입니다. – chthonicdaemon