如何使用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]
答案 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))
希望这很有用。