Je n'ai pas été capable de trouver une fonction pour générer un tableau de flottants aléatoires d'une longueur donnée entre une certaine plage.
J'ai regardé échantillonnage aléatoire mais aucune fonction ne semble faire ce dont j'ai besoin.
random.uniform se rapproche mais il ne retourne qu'un seul élément, pas un nombre spécifique.
C'est ce que je recherche:
ran_floats = some_function(low=0.5, high=13.3, size=50)
qui retournerait un tableau de 50 floats non uniques aléatoires (c'est-à-dire que les répétitions sont autorisées) uniformément répartis dans l'intervalle [0.5, 13.3]
.
Y a-t-il une telle fonction?
np.random.uniform
correspond à votre cas d'utilisation: http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.uniform.html
sampl = np.random.uniform(low=0.5, high=13.3, size=(50,))
Pourquoi ne pas utiliser une liste de compréhension?
ran_floats = [random.uniform(low,high) for _ in xrange(size)]
La boucle de lecture en liste prend du temps et la ralentit. Il est préférable d’utiliser des paramètres numpy (low, high, size, ..etc)
import numpy as np
import time
rang = 10000
tic = time.time()
for i in range(rang):
sampl = np.random.uniform(low=0, high=2, size=(182))
print("it took: ", time.time() - tic)
tic = time.time()
for i in range(rang):
ran_floats = [np.random.uniform(0,2) for _ in range(182)]
print("it took: ", time.time() - tic)
exemple de sortie:
('il a fallu:', 0.06406784057617188)
('il a fallu:', 1.7253198623657227)
Pourquoi ne pas combiner random.uniform avec une liste de compréhension?
>>> def random_floats(low, high, size):
... return [random.uniform(low, high) for _ in xrange(size)]
...
>>> random_floats(0.5, 2.8, 5)
[2.366910411506704, 1.878800401620107, 1.0145196974227986, 2.332600336488709, 1.945869474662082]
Sinon, vous pouvez utiliser SciPy
from scipy import stats
stats.uniform(0.5, 13.3).rvs(50)
et pour l'enregistrement à échantillonner des entiers c'est
stats.randint(10, 20).rvs(50)
Il y a peut-être déjà une fonction pour faire ce que vous cherchez, mais je ne le sais pas (encore?). En attendant, je suggérerais d'utiliser:
ran_floats = numpy.random.Rand(50) * (13.3-0.5) + 0.5
Cela produira un tableau de formes (50,) avec une distribution uniforme entre 0.5 et 13.3.
Vous pouvez également définir une fonction:
def random_uniform_range(shape=[1,],low=0,high=1):
"""
Random uniform range
Produces a random uniform distribution of specified shape, with arbitrary max and
min values. Default shape is [1], and default range is [0,1].
"""
return numpy.random.Rand(shape) * (high - min) + min
EDIT : Hmm, oui, alors je l'ai raté, il y a numpy.random.uniform () avec le même appel que vous voulez! Essayez import numpy; help(numpy.random.uniform)
pour plus d'informations.
C'est le moyen le plus simple
np.random.uniform(start,stop,(rows,columns))