用不同范围的随机数生成numpy数组的每一列

8
如何高效地生成一个numpy数组,使得数组的每一列来自于不同范围内的均匀分布?以下代码使用了两个for循环,速度较慢,有没有更快的矩阵方式来生成这样的数组呢?谢谢。
import numpy as np
num = 5
ranges = [[0,1],[4,5]]
a = np.zeros((num, len(ranges)))
for i in range(num):
    for j in range(len(ranges)):
        a[i, j] = np.random.uniform(ranges[j][0], ranges[j][1])
2个回答

13
你可以先生成区间 [0, 1) 中的所有随机数,然后按比例缩放和移位:

你可以先在区间 [0, 1) 中生成所有的随机数,然后再根据需要进行缩放和平移:


import numpy as np
num = 5
ranges = np.asarray([[0,1],[4,5]])
starts = ranges[:, 0]
widths = ranges[:, 1]-ranges[:, 0]
a = starts + widths*np.random.random(size=(num, widths.shape[0]))

基本上,你需要通过np.random.random(size=(num, widths.shape[0]))创建一个正确大小的数组,其中包含0到1之间的随机数。然后,你需要按比例缩放每个值,这个比例因子对应于你实际想要采样的区间的宽度。最后,你需要通过starts将它们移动以考虑不同区间的起始值。


优秀的方法! - Eric Duminil

8

numpy.random.uniform可以广播其参数,通过传递以下参数,它可以生成所需的样本:

  • low:低值序列。
  • high:高值序列。
  • size:类似于(num, m)的元组,其中m是范围的数量,num是要生成的m个样本组的数量。

例如:

In [23]: num = 5

In [24]: ranges = np.array([[0, 1], [4, 5], [10, 15]])

In [25]: np.random.uniform(low=ranges[:, 0], high=ranges[:, 1], size=(num, ranges.shape[0]))
Out[25]: 
array([[  0.98752526,   4.70946614,  10.35525699],
       [  0.86137374,   4.22046152,  12.28458447],
       [  0.92446543,   4.52859103,  11.30326391],
       [  0.0535877 ,   4.8597036 ,  14.50266784],
       [  0.55854656,   4.86820001,  14.84934564]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接