Сгенерировать случайный массив чисел с плавающей запятой между диапазоном

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% правы. Я пропустил эту функцию, и, похоже, она делает именно то, что мне нужно. Не могли бы вы представить свой комментарий в качестве ответа?
Габриэль

Ответы:

135

np.random.uniform подходит для вашего варианта использования:

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

Обновление за октябрь 2019 г .:

Хотя синтаксис все еще поддерживается, похоже, что в NumPy 1.17 API был изменен для поддержки большего контроля над генератором случайных чисел. В дальнейшем 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). Вот как хорошо разработаны библиотеки Python # вау
Сараванабалаги Рамачандран
Размер не совсем понятен, и ссылка не работает. Вот небольшое уточнение. size: int или кортеж целых чисел, необязательно. Форма вывода. Если заданная форма, например, (m, n, k), то отрисовывается m * n * k выборок. Если размер по умолчанию None), возвращается одно значение, если оба значения low и high являются скалярами.
vlad
@vlad - спасибо, что указали на проблему со ссылкой. Я обновил ответ, чтобы, надеюсь, охватить текущее использование.
JoshAdel
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]
pkacprzak
источник
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)дополнительную информацию.

PhilMacKay
источник
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)
Стюарт Хэллоус
источник
2

Это самый простой способ

np.random.uniform(start,stop,(rows,columns))
Джордж Джи
источник
0

np.random.random_sample(size) будет генерировать случайные числа с плавающей запятой в полуоткрытом интервале [0.0, 1.0).

Шиварадж Карки
источник