生成范围之间的随机浮点数组


88

我还没有找到一个函数来生成在一定范围内给定长度的随机浮点数组。

我看过随机抽样,但是似乎没有函数可以满足我的需要。

random.uniform接近,但它仅返回单个元素,而不返回特定数字。

这就是我所追求的:

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

这将返回在range中均匀分布的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%正确的。我错过了该功能,它似乎完全可以满足我的需求。您介意将您的评论作为答案吗?
加百利

Answers:


135

np.random.uniform 适合您的用例:

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

2019年10月更新:

虽然仍支持语法,但看起来API随NumPy 1.17更改了,以支持对随机数生成器的更好控制。前进的API已经更改,您应该查看https://docs.scipy.org/doc/numpy/reference/random/generation/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库设计得很好的方式#哇
Saravanabalagi Ramachandran

大小不完全清楚,链接不起作用。这是一个小澄清。 尺寸: int或int的元组,可选。输出形状。如果给定的形状是例如(m,n,k),则绘制m * n * k个样本。如果size缺省为None),如果low和high均为标量,则返回单个值。
vlad

@vlad-感谢您指出链接的问题。我已经更新了答案,希望可以涵盖当前的用法。
JoshAdel

20

为什么不使用列表推导?

在Python 2中

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

在Python 3中,range工作方式类似于xrangeref

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参数(低,高,大小,.. etc等)

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.