如何使用Numpy随机获得3个浮点数,步长为0.5,介于5.0和9.0之间?

时间:2014-11-15 04:56:34

标签: python numpy

如何使用Numpy以0.5和5.0之间的步长随机获得3个浮点数?

我尝试如下:

np.random.uniform(5.0,9.0) 

但它不包括'step'参数。

编辑: Python random.randrange提供了使用'step'的方法。但它只适用于整数。

random.randrange(start, stop[, step])

我想得到3个这样的数字:

预期结果应如下:

ans = [5.5, 6.0, 8.5]

3 个答案:

答案 0 :(得分:3)

只是分开......

val = np.random.randint(2*5,2*9)/2.

randint返回一个在[10,18]范围内的均匀分布的整数,然后你只需要浮动除以2.这样做的好处是相当快:

In [120]: %timeit np.random.randint(2*5,2*9)/2.
1000000 loops, best of 3: 329 ns per loop

In [121]: %timeit 0.5 * ceil(2.0 * np.random.uniform(5.0, 9.0))
100000 loops, best of 3: 4.61 µs per loop

为了使这更通用:

def rand_with_step(low,high,step,count=1,bias=False):
    n = 1/step
    if count > 1:
        val = np.random.randint(low*n,high*n,count)*step
    else:
        val= np.random.randint(low*n,high*n)*step

    if bias:
        bias = ceil(low/step)*step - low
    else:
        bias = 0
    return val - bias

此处,偏差标志确定是否从low的值开始计算步数。

例如:

In [190]: rand_with_step(5,9,0.11,1,True)
Out[190]: 7.31

这应该是正确的,因为(7.31 - 5)/0.11 = 29是该步骤的完整倍数。

值得注意的是,即使使用预先计算的数字池,这种方法也比np.random.choice更快(尽管我不清楚为什么)。

In [343]: x = np.arange(5, 9, 0.5)

In [344]: %timeit np.random.choice(x,size=3)
10000 loops, best of 3: 29.7 µs per loop

In [345]: %timeit rand_with_step(5,9,0.5,3,True)
10000 loops, best of 3: 25.3 µs per loop

答案 1 :(得分:2)

我可能会使用类似@ ebarr的答案,但这里有另一种选择。

使用np.arange创建所需范围,然后使用np.random.choice从该数组中选择:

In [134]: np.random.choice(np.arange(5, 9, 0.5), size=3)
Out[134]: array([ 7. ,  8.5,  7.5])

请注意,如果您使用此类arange,则9不会包含在可能的输出中。如果您想要包含上限,可以使用np.arange(5, 9.25, 0.5),或者更一般地使用np.arange(start, stop+0.5*step, step)

如果所需范围很大并且您只选择了几个值,则效率不高。如果要重复选择同一组数字,可以定义一次可能的值并重用该变量:

In [135]: values = np.arange(5, 9, 0.5)

In [136]: np.random.choice(values, size=3)
Out[136]: array([ 6.5,  5. ,  6. ])

In [137]: np.random.choice(values, size=5)
Out[137]: array([ 6. ,  8. ,  6. ,  7.5,  8. ])

答案 2 :(得分:1)

这应该这样做:

0.5 * floor(2.0 * np.random.uniform(5.0, 9.0))

希望这很有用。