मैं सुन्न में गैर-दोहराव यादृच्छिक संख्या कैसे उत्पन्न कर सकता हूं?
list = np.random.random_integers(20,size=(10))
मैं सुन्न में गैर-दोहराव यादृच्छिक संख्या कैसे उत्पन्न कर सकता हूं?
list = np.random.random_integers(20,size=(10))
जवाबों:
numpy.random.Generator.choice
replace
प्रतिस्थापन के बिना नमूने के लिए एक तर्क प्रदान करता है :
from numpy.random import default_rng
rng = default_rng()
numbers = rng.choice(20, size=10, replace=False)
यदि आप बिना Generator
API के पूर्व 1.17 नंबर पर हैं , तो आप random.sample()
मानक पुस्तकालय से उपयोग कर सकते हैं :
print(random.sample(range(20), 10))
आप इसका उपयोग numpy.random.shuffle()
और टुकड़ा कर सकते हैं , लेकिन यह कम कुशल होगा:
a = numpy.arange(20)
numpy.random.shuffle(a)
print a[:10]
replace
विरासत numpy.random.choice
समारोह में एक तर्क भी है , लेकिन इस तर्क को अक्षम रूप से लागू किया गया था और फिर यादृच्छिक संख्या स्ट्रीम स्थिरता की गारंटी के कारण अक्षम छोड़ दिया गया था, इसलिए इसका उपयोग अनुशंसित नहीं है। (यह मूल रूप से फेरबदल और स्लाइस बात आंतरिक रूप से करता है।)
random.sample(range(n), 10))
बहुत बड़े के लिए भी कुशल होगा n
, क्योंकि एक range
ऑब्जेक्ट सिर्फ एक छोटा आवरण है, जिसमें स्टॉप स्टार्ट, स्टॉप और वैल्यू स्टोर होता है, लेकिन पूर्णांकों की पूरी सूची नहीं बनाता है। अजगर 2 में, आप बदल सकते हैं range
के साथ xrange
एक समान व्यवहार मिलता है।
मुझे लगता numpy.random.sample
है कि अभी काम नहीं करता है। यह मेरा तरीका है:
import numpy as np
np.random.choice(range(20), 10, replace=False)
range(n)
(या arange(n)
) के पहले तर्क के रूप में choice
, यह सिर्फ पास करने के लिए बराबर है n
, उदा choice(20, 10, replace=False)
।
np.random.choice(a, size, replace=False)
बड़े के लिए बहुत धीमी है a
- मेरी मशीन पर, = 1M के लिए लगभग 30 एमएस।
n
उपयोग के लिए समय और स्मृति के मुद्दों से बचने के लिए numpy.random.Generator.choice
(सुपीरियर v1.17 से शुरू)
वर्षों बाद, 10000 ^ 2 में से 40000 को चुनने के लिए कुछ समय (Numpy 1.8.1, imac 2.7 GHz):
import random
import numpy as np
n = 10000
k = 4
np.random.seed( 0 )
%timeit np.random.choice( n**2, k * n, replace=True ) # 536 µs ± 1.58 µs
%timeit np.random.choice( n**2, k * n, replace=False ) # 6.1 s ± 9.91 ms
# https://docs.scipy.org/doc/numpy/reference/random/index.html
randomstate = np.random.default_rng( 0 )
%timeit randomstate.choice( n**2, k * n, replace=False, shuffle=False ) # 766 µs ± 2.18 µs
%timeit randomstate.choice( n**2, k * n, replace=False, shuffle=True ) # 1.05 ms ± 1.41 µs
%timeit random.sample( range( n**2 ), k * n ) # 47.3 ms ± 134 µs
(10000 ^ 2 में से 40000 का चयन क्यों? बड़ी scipy.sparse.random
matrices उत्पन्न करने के लिए
- scipy 1.4.1 उपयोग करता है np.random.choice( replace=False )
, slooooow।)
टोपी की टिप numpy.random लोगों को।
पायथन सेट सूची रूपांतरण का उपयोग किया जा सकता है। 0 से 20 के बीच 10 अद्वितीय संख्याएँ इस प्रकार प्राप्त की जा सकती हैं:
import numpy as np
import random
unique_numbers=set()
while(len(unique_numbers)<10):
unique_numbers.add(np.random.randint(0,20))
unique_numbers=list(unique_numbers)
random.shuffle(unique_numbers)
print(unique_numbers)
बस एक सरणी उत्पन्न करें जिसमें संख्याओं की आवश्यक सीमा होती है, फिर उन्हें सरणी में 0 वें तत्व के साथ यादृच्छिक रूप से स्वैप करके उन्हें फेरबदल करें। यह एक यादृच्छिक अनुक्रम पैदा करता है जिसमें डुप्लिकेट मान नहीं होते हैं।