2011-01-31 3 views
5

range(n)의 가능한 모든 튜플 중에서 샘플을 교체하지 않아도됩니다. 즉, (0,0), (0,1), ..., (0, n), (1,0), (1,1), ..., (1, n), ..., (n, 0), ((n, 1), (n, n)), 그리고 그 원소의 k 샘플을 얻으려고합니다. 이 컬렉션을 명시 적으로 작성하는 것을 피하기를 희망합니다.파이썬 : 2D 그리드에서 대체하지 않고 샘플링

숫자 튜플이 아닌 일련의 숫자에서 샘플을 필요로한다면 random.sample(range(n), k)이 간단하고 효율적이라는 것을 알고 있습니다.

물론 가능한 모든 (n * n = n^2) 튜플을 포함하는 목록을 명시 적으로 작성한 다음 random.sample을 호출 할 수 있습니다. 하지만 kn^2보다 훨씬 작 으면 효율적이지 않을 수 있습니다.

효율성면에서 파이썬 2와 3에서 일들이 똑같이 작동하는지 확신 할 수 없습니다. 나는 파이썬 3을 사용합니다.

+2

튜플 시퀀스는, 그래서 당신의 문장은 "오히려 숫자의 튜플보다 숫자의 순서에서 샘플을 필요로했다." 이치에 맞지 않는다. 일련의 튜플에서 샘플이 필요하다는 것을 의미합니까? 이 튜플이 어떻게 보이는지는 명확하지 않습니다. –

+0

당신의 코드 ('random.sample (range (n), k)')는 작동하며 모든 시퀀스, 튜플,리스트, 문자열 그리고'collections.Sequence'의 서브 클래스에 적합합니다. ? –

+0

@Regebro : '튜플에서 샘플'= 'n 튜플 시퀀스에서 k 개의 튜플 샘플'. '시퀀스의 샘플'= 'n 개의 요소의 시퀀스에서 k 개의 요소 샘플'. 내가 명확히하기 위해 질문을 편집 할 것입니다. @ S.Lott : 시퀀스 ((0,0), (0,1), (0,2), (1,0), (1,1) , (1,2), (2,0), (2,1), (2,2))을 간단하게 '범위'로 사용하여 간단히 '샘플'을 적용 할 수 있습니다. – max

답변

6

이들 중 몇 개를 선택 하느냐에 따라, 이미 선택한 항목을 (set을 통해) 추적하고 뭔가를 얻을 때까지 다시 선택하는 것이 가장 간단 할 수 있습니다 너는 이미 선택하지 않았다. (손에 더 파이썬)을 시도하지 않고

numbers_in_nxn = random.sample(range(n*n), k) # Use xrange in Python 2.x 
tuples_in_nxn = [divmod(x,n) for x in numbers_in_nxn] 
+0

나는이 부분을 넣었다는 것을 깨달았을 때 내가 쓰고 있던 것이기 때문에 당신이'random.sample (range (n * n), k)'을 의미했다고 생각한다. –

+0

+1 두 번째 옵션은 나에게 완벽 해 보인다. 'n * n'을'range (n * n)','100'을'n '으로 대체 한 후). '샘플'이 매우 효율적이라고 주장 할 때 세트에서 그림을 그릴 때 더 좋은 점을 생각할 수 없습니다. – max

+1

'(x % n, x // n)'을'divmod (x, n)'로 바꿀 수 있습니다. – Kabie

0

:

다른 옵션은 단지 몇 가지 간단한 수학을 사용하는 것입니다

random.shuffle(range(n))[:k] 

하는 의견을 참조하십시오. ... 충분히

+0

''n' x'n'에 튜플을주지 않습니다. 왜냐하면 결코'(1,1)'이라고 말하지 않을 것이기 때문입니다. – Amber

+0

그러나 "대체하지 않는다"는 의미는 무엇입니까? 아, 이제 알겠습니다. k 개의 고유 한 튜플 길이 n. – Howard

0

잠을하지 않았다 당신 말 :

은 물론, 내가 명시 적으로 모든 가능한을 포함하는 목록을 구축 할 수 있습니다 (N * N = N^2) 튜플, 다음 전화 무작위 샘플. 그러나 k가 훨씬 작 으면 은 효율적이지 않을 것입니다. 은 n^2보다 큽니다.

튜플을 구성하는 방법에 대해 을 무작위로 선택 했습니까? 예를 들어, 선택하기 전에 무작위로 튜플을 만들 수 있다면 먼저 픽업을하고 나중에 빌드 할 수 있습니다.

대신이 일을 :

나는 당신의 튜플은 같은 길이의 모두 실현하지만 내가 당신의 튜플이보고되어 있지만, 여기에 예입니다 방법을 이해하지 못하고,이 원리를 보여줍니다

>>> import random 
>>> all_sequences = [range(x) for x in range(10)] 
>>> all_sequences 
[[], [0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7, 8]] 
>>> random.sample(all_sequences, 3) 
[[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5, 6, 7, 8]] 

이 작업을 수행 할 것입니다 :

>>> import random 
>>> selection = random.sample(range(10), 3) 
>>> [range(x) for a in selection] 
[[0, 1, 2, 3, 4, 5, 6, 7, 8], [0, 1, 2, 3, 4, 5, 6, 7, 8], [0, 1, 2, 3, 4, 5, 6, 7, 8]] 
관련 문제