Nie udało mi się znaleźć funkcji do generowania tablicy losowych liczb zmiennoprzecinkowych o danej długości w pewnym zakresie.
Sprawdziłem losowe próbkowanie, ale żadna funkcja nie wydaje się robić tego, czego potrzebuję.
random.uniform zbliża się, ale zwraca tylko jeden element, a nie określoną liczbę.
To jest to, czego szukam:
ran_floats = some_function(low=0.5, high=13.3, size=50)
co zwróciłoby tablicę 50 losowych, nieunikalnych wartości zmiennoprzecinkowych (tj. dozwolone są powtórzenia) równomiernie rozmieszczonych w zakresie [0.5, 13.3]
.
Czy jest taka funkcja?
numpy
, ale nie wspomniałeś o tymnumpy.random.uniform
, mimo że ma dokładnie taką sygnaturę, jaką chcesz. Czy masznumpy
dostępną bibliotekę?[random.uniform(low, high) for i in xrange(size)]
Odpowiedzi:
np.random.uniform
pasuje do twojego przypadku użycia:sampl = np.random.uniform(low=0.5, high=13.3, size=(50,))
Aktualizacja październik 2019:
Chociaż składnia jest nadal obsługiwana, wygląda na to, że API zmieniło się w NumPy 1.17, aby zapewnić większą kontrolę nad generatorem liczb losowych. Idąc dalej, API się zmieniło i powinieneś spojrzeć na https://docs.scipy.org/doc/numpy/reference/random/generated/numpy.random.Generator.uniform.html
Propozycja ulepszenia znajduje się tutaj: https://numpy.org/neps/nep-0019-rng-policy.html
źródło
some_function(low=0.5, high=13.3, size=50)
. Tak dobrze są zaprojektowane biblioteki Pythona #wowDlaczego nie skorzystać ze zrozumienia listy?
W Pythonie 2
ran_floats = [random.uniform(low,high) for _ in xrange(size)]
W Pythonie 3
range
działa jakxrange
( ref )ran_floats = [random.uniform(low,high) for _ in range(size)]
źródło
Dlaczego nie połączyć random.uniform ze zrozumieniem listy?
>>> 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]
źródło
Może już istnieje funkcja, która robi to, czego szukasz, ale nie wiem o tym (jeszcze?). W międzyczasie sugerowałbym użycie:
ran_floats = numpy.random.rand(50) * (13.3-0.5) + 0.5
Spowoduje to utworzenie szeregu kształtów (50,) z równomiernym rozkładem między 0,5 a 13,3.
Możesz także zdefiniować funkcję:
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
EDYCJA : Hmm, tak, więc przegapiłem to, jest numpy.random.uniform () z dokładnie tym samym wywołaniem, które chcesz! Spróbuj
import numpy; help(numpy.random.uniform)
uzyskać więcej informacji.źródło
Pętla for w zrozumieniu list wymaga czasu i spowalnia. Lepiej jest używać parametrów 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)
przykładowe wyjście:
(„zajęło to:”, 0,06406784057617188)
(„zajęło to:”, 1,7253198623657227)
źródło
Alternatywnie możesz użyć SciPy
from scipy import stats stats.uniform(0.5, 13.3).rvs(50)
a dla rekordu próbkowania liczb całkowitych jest to
stats.randint(10, 20).rvs(50)
źródło
To jest najprostszy sposób
źródło
np.random.random_sample(size)
wygeneruje losowe liczby zmiennoprzecinkowe w półotwartym interwale [0,0, 1,0).źródło