Подтвердить что ты не робот

Генерировать случайный массив поплавков между диапазоном

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

Я посмотрел на случайную выборку, но, похоже, ни одна функция не выполняет то, что мне нужно.

random.uniform подходит близко, но возвращает только один элемент, а не конкретное число.

Это то, что я после:

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

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

Есть ли такая функция?

4b9b3361

Ответ 1

np.random.uniform подходит для вашего случая использования: http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.uniform.html

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

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

Хотя синтаксис все еще поддерживается, похоже, что API изменился, чтобы обеспечить больший контроль над генератором случайных чисел. До этого изменения, документы здесь: https://docs.scipy.org/doc/numpy-1.16.0/reference/generated/numpy.random.uniform.html

В дальнейшем API изменился, и вы должны посмотреть на:

https://docs.scipy.org/doc/numpy/reference/random/generated/numpy.random.Generator.uniform.html

Предложение по улучшению здесь:

https://numpy.org/neps/nep-0019-rng-policy.html

Ответ 2

Почему бы не использовать понимание списка?

ran_floats = [random.uniform(low,high) for _ in xrange(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]

Ответ 4

Цикл 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)

Ответ 5

Возможно, уже существует функция, чтобы делать то, что вы ищете, но я не знаю об этом (пока?). Тем временем, я бы посоветовал использовать:

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

EDIT: Хм, да, поэтому я пропустил это, есть numpy.random.uniform() с тем же самым точным вызовом, который вы хотите! Попробуйте import numpy; help(numpy.random.uniform) для получения дополнительной информации.

Ответ 6

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

np.random.uniform(start,stop,(rows,columns))

Ответ 7

В качестве альтернативы вы можете использовать SciPy

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

и для записи для выборки целых чисел это

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