Numpy'de tekrar etmeyen rastgele sayıları nasıl üretebilirim?
list = np.random.random_integers(20,size=(10))
Numpy'de tekrar etmeyen rastgele sayıları nasıl üretebilirim?
list = np.random.random_integers(20,size=(10))
Yanıtlar:
numpy.random.Generator.choice
replace
değiştirilmeden örnekleme için bir argüman sunar :
from numpy.random import default_rng
rng = default_rng()
numbers = rng.choice(20, size=10, replace=False)
Generator
API olmadan 1.17 öncesi bir NumPy kullanıyorsanız random.sample()
, standart kitaplıktan kullanabilirsiniz:
print(random.sample(range(20), 10))
Ayrıca kullanabilir numpy.random.shuffle()
ve dilimleyebilirsiniz, ancak bu daha az verimli olacaktır:
a = numpy.arange(20)
numpy.random.shuffle(a)
print a[:10]
replace
Eski numpy.random.choice
işlevde de bir argüman var , ancak bu argüman verimsiz bir şekilde uygulandı ve ardından rastgele sayı akışı kararlılığı garantileri nedeniyle verimsiz kaldı, bu nedenle kullanımı önerilmez. (Temelde karıştırma ve dilimleme işini dahili olarak yapar.)
random.sample(range(n), 10))
çok büyükler için bile verimli olacaktır . Python 2'de, benzer bir davranış elde etmek için ile değiştirebilirsiniz . n
range
range
xrange
Sanırım numpy.random.sample
şu anda çalışmıyor. Bu benim yolum:
import numpy as np
np.random.choice(range(20), 10, replace=False)
range(n)
(veya arange(n)
) yerine, choice
sadece pass'a eşdeğerdir n
, örn choice(20, 10, replace=False)
.
np.random.choice(a, size, replace=False)
büyük için çok yavaş olduğunu unutmayın a
- makinemde a = 1M için yaklaşık 30 ms.
n
numpy.random.Generator.choice
Yıllar sonra, 10000 ^ 2'den 40000'ü seçmek için bazı zamanlar (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
(Neden 10000 ^ 2 üzerinden 40000'ü seçmelisiniz ? Büyük scipy.sparse.random
matrisleri oluşturmak için
- scipy 1.4.1 kullanır np.random.choice( replace=False )
, slooooow.)
Şapkanın ucu uyuşmuş insanlara.
Python set listesi dönüşümü kullanılabilir. 0 ile 20 arasında 10 benzersiz sayı şu şekilde elde edilebilir:
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)
Basitçe, gerekli sayı aralığını içeren bir dizi oluşturun, ardından rastgele bir tanesini dizideki 0. elemanla tekrar tekrar değiştirerek bunları karıştırın. Bu, yinelenen değerler içermeyen rastgele bir dizi üretir.