Generuj losową tablicę wartości zmiennoprzecinkowych między zakresem

88

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?

Gabriel
źródło
5
Oznaczyłeś pytanie numpy, ale nie wspomniałeś o tym numpy.random.uniform, mimo że ma dokładnie taką sygnaturę, jaką chcesz. Czy masz numpydostępną bibliotekę?
DSM,
1
[random.uniform(low, high) for i in xrange(size)]
Filogeneza
1
@DSM tak, mam i najwyraźniej masz 100% racji. Brakowało mi tej funkcji i wydaje się, że robi dokładnie to, czego potrzebuję. Czy mógłbyś przedstawić swój komentarz jako odpowiedź?
Gabriel,

Odpowiedzi:

135

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

JoshAdel
źródło
23
Pytanie dotyczące intuicyjnego wyszukiwania OP to some_function(low=0.5, high=13.3, size=50). Tak dobrze są zaprojektowane biblioteki Pythona #wow
Saravanabalagi Ramachandran
Rozmiar nie był do końca jasny, a link nie działa. Oto drobne wyjaśnienie. size: int lub tuple of ints, opcjonalnie. Kształt wyjściowy. Jeżeli dany kształt to np. (M, n, k), to losowane są próbki m * n * k. Jeśli rozmiar ma wartość domyślną Brak), zwracana jest pojedyncza wartość, jeśli niskie i wysokie są skalarami.
vlad
@vlad - dzięki za wskazanie problemu z linkiem. Zaktualizowałem odpowiedź, aby, miejmy nadzieję, uwzględnić obecne użycie.
JoshAdel
20

Dlaczego nie skorzystać ze zrozumienia listy?

W Pythonie 2

ran_floats = [random.uniform(low,high) for _ in xrange(size)]

W Pythonie 3 rangedziała jak xrange( ref )

ran_floats = [random.uniform(low,high) for _ in range(size)]
isedev
źródło
3

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]
pkacprzak
źródło
3

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.

PhilMacKay
źródło
3

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)

Mohamed Ibrahim
źródło
3

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)
Stuart Hallows
źródło
2

To jest najprostszy sposób

np.random.uniform(start,stop,(rows,columns))
George Gee
źródło
0

np.random.random_sample(size) wygeneruje losowe liczby zmiennoprzecinkowe w półotwartym interwale [0,0, 1,0).

shivaraj karki
źródło