Мне не удалось найти функцию для генерации массива случайных чисел с плавающей запятой заданной длины в определенном диапазоне.
Я посмотрел на случайную выборку, но, похоже, ни одна функция не выполняет то, что мне нужно.
random.uniform подходит близко, но возвращает только один элемент, а не конкретное число.
Вот что мне нужно:
ran_floats = some_function(low=0.5, high=13.3, size=50)
который вернет массив из 50 случайных неуникальных чисел с плавающей запятой (то есть: разрешены повторения), равномерно распределенных в диапазоне [0.5, 13.3]
.
Есть такая функция?
numpy
, но не упомянулиnumpy.random.uniform
, хотя в нем есть именно та подпись вызова, которую вы хотите. У вас естьnumpy
библиотека?[random.uniform(low, high) for i in xrange(size)]
Ответы:
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
источник
some_function(low=0.5, high=13.3, size=50)
. Вот как хорошо разработаны библиотеки Python # вауПочему бы не использовать понимание списка?
В 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)]
источник
Почему бы не совместить 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]
источник
Возможно, уже есть функция для выполнения того, что вы ищете, но я не знаю об этом (пока?). А пока я предлагаю использовать:
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)
дополнительную информацию.источник
Понимание цикла 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)
источник
В качестве альтернативы вы можете использовать SciPy
from scipy import stats stats.uniform(0.5, 13.3).rvs(50)
а для записи выборки целых чисел это
stats.randint(10, 20).rvs(50)
источник
Это самый простой способ
источник
np.random.random_sample(size)
будет генерировать случайные числа с плавающей запятой в полуоткрытом интервале [0.0, 1.0).источник