Генерировать случайный массив поплавков между диапазоном
Мне не удалось найти функцию для генерации массива случайных чисел с заданной длиной в определенном диапазоне.
Я посмотрел на случайную выборку, но, похоже, ни одна функция не выполняет то, что мне нужно.
random.uniform подходит близко, но возвращает только один элемент, а не конкретное число.
Это то, что я после:
ran_floats = some_function(low=0.5, high=13.3, size=50)
который возвращает массив из 50 случайных неуникальных операций с плавающей запятой (т.е. допускаются повторы), равномерно распределенных в диапазоне [0.5, 13.3]
.
Есть ли такая функция?
Ответы
Ответ 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)