Створення випадкового масиву плаваючих значень між діапазоном


88

Я не зміг знайти функцію для створення масиву випадкових плаваючих значень заданої довжини між певним діапазоном.

Я розглянув випадкову вибірку, але, здається, жодна функція не робить того, що мені потрібно.

random.uniform наближається, але повертає лише один елемент, а не конкретне число.

Це те, що я шукаю:

ran_floats = some_function(low=0.5, high=13.3, size=50)

який повертав би масив із 50 випадкових неунікальних плаваючих значень (тобто: дозволено повторення), рівномірно розподілених у діапазоні [0.5, 13.3].

Чи існує така функція?


5
Ви позначили запитання тегом numpy, але не згадали numpy.random.uniform, хоча воно має саме той підпис дзвінка, який ви хочете. Чи є у вас numpyбібліотека?
DSM

1
[random.uniform(low, high) for i in xrange(size)]
Філогенез

1
@DSM так, я маю, і ви, мабуть, на 100% правильні. Я пропустив цю функцію, і, схоже, я роблю саме те, що мені потрібно. Не могли б ви представити свій коментар як відповідь?
Габріель

Відповіді:


136

np.random.uniform відповідає вашому випадку використання:

sampl = np.random.uniform(low=0.5, high=13.3, size=(50,))

Оновлення жовтня 2019 року:

Хоча синтаксис все ще підтримується, схоже, API змінився за допомогою NumPy 1.17, щоб підтримати більший контроль над генератором випадкових чисел. Надалі API змінився, і ви повинні переглянути https://docs.scipy.org/doc/numpy/reference/random/generated/numpy.random.Generator.uniform.html

Пропозиція щодо вдосконалення знаходиться тут: https://numpy.org/neps/nep-0019-rng-policy.html


23
Питання інтуїтивного пошуку OP - це some_function(low=0.5, high=13.3, size=50). Ось так добре розроблені пітонові бібліотеки # wow
Saravanabalagi Ramachandran

Розмір був не зовсім зрозумілим, а посилання не працює. Ось незначне уточнення. розмір: int або кортеж ints, необов’язково. Вихідна форма. Якщо задана форма є, наприклад, (m, n, k), то малюються зразки m * n * k. Якщо за замовчуванням розмір None), повертається одне значення, якщо низьким і високим є скаляри.
vlad

@vlad - дякую, що вказали на проблему за посиланням. Я оновив відповідь, щоб, сподіваюся, охопити поточне використання.
ДжошАдель,

20

Чому б не використовувати розуміння списку?

У Python 2

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

У Python 3 rangeпрацює як xrange( ref )

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

3

Чому б не поєднати random.uniform із розумінням списку?

>>> 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]

3

Можливо, вже є функція, яка робить те, що ви шукаєте, але я не знаю про це (поки що?). Тим часом я б запропонував використовувати:

ran_floats = numpy.random.rand(50) * (13.3-0.5) + 0.5

Це дасть масив фігури (50,) з рівномірним розподілом між 0,5 і 13,3.

Ви також можете визначити функцію:

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

РЕДАКТУВАТИ : Хм, так, я пропустив це, є numpy.random.uniform () з тим самим точним дзвінком, який ви хочете! Спробуйте import numpy; help(numpy.random.uniform)отримати додаткову інформацію.


3

Цикл for у розумінні списку вимагає часу і робить його повільним. Краще використовувати параметри numpy (низький, високий, розмір, .. тощо)

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)

зразок виводу:

("потрібно:", 0,06406784057617188)

("потрібно:", 1.7253198623657227)


3

В якості альтернативи ви можете використовувати SciPy

from scipy import stats
stats.uniform(0.5, 13.3).rvs(50)

а для запису для вибірки цілих чисел це

stats.randint(10, 20).rvs(50)


0

np.random.random_sample(size) буде генерувати випадкові плаваючі значення в напіввідкритому інтервалі [0,0, 1,0).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.