web-dev-qa-db-fra.com

Quelle est la meilleure façon d'obtenir des nombres aléatoires dans NumPy?

Je veux générer des nombres aléatoires dans la plage -1, 1 et veulent que chacun ait la même probabilité d'être généré. C'est à dire. Je ne veux pas que les extrêmes soient moins susceptibles de se produire. Quelle est la meilleure façon de procéder?

Jusqu'à présent, j'ai utilisé:

2 * numpy.random.Rand() - 1

et aussi:

2 * numpy.random.random_sample() - 1
22
wot

Votre approche est bonne. Une alternative consiste à utiliser la fonction numpy.random.uniform() :

>>> numpy.random.uniform(-1, 1, size=10)
array([-0.92592953, -0.6045348 , -0.52860837,  0.00321798,  0.16050848,
       -0.50421058,  0.06754615,  0.46329675, -0.40952318,  0.49804386])

En ce qui concerne la probabilité des extrêmes: si elle était idéalisée, des nombres aléatoires continus, la probabilité d'obtenir l'un des extrêmes serait 0. Étant donné que les nombres à virgule flottante sont une discrétisation des nombres réels continus, il existe en réalité une probabilité positive de obtenir certains des extrêmes. Il s'agit d'une forme d'erreur de discrétisation, et il est presque certain que cette erreur sera éclipsée par d'autres erreurs dans votre simulation. Arrête de t'en faire!

32
Sven Marnach

Notez que numpy.random.Rand permet de générer plusieurs échantillons à partir d'une distribution uniforme en un seul appel:

>>> np.random.Rand(5)
array([ 0.69093485,  0.24590705,  0.02013208,  0.06921124,  0.73329277])

Il permet également de générer des échantillons dans une forme donnée:

>>> np.random.Rand(3,2)
array([[ 0.14022471,  0.96360618], 
       [ 0.37601032,  0.25528411], 
       [ 0.49313049,  0.94909878]])

Comme vous l'avez dit, des nombres aléatoires uniformément répartis entre [-1, 1) peuvent être générés avec:

>>> 2 * np.random.Rand(5) - 1
array([ 0.86704088, -0.65406928, -0.02814943,  0.74080741, -0.14416581])
3
Adobe

De la documentation de numpy.random.random_sample :

Les résultats proviennent de la distribution "uniforme continue" sur l'intervalle indiqué. Pour échantillonner Unif [A, b), b> a multipliez la sortie de random_sample par (b-a) et ajoutez a:

 (b - a) * random_sample() + a

Selon la réponse de Sven Marnach, la documentation doit probablement être mise à jour pour faire référence à numpy.random.uniform .

2
ecatmur