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

时间:2017-11-22 15:23:38

标签: python numpy

如何生成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 个答案:

答案 0 :(得分:10)

你可以做的是首先在区间[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以考虑间隔的不同起始值。

答案 1 :(得分:2)

numpy.random.uniform将广播其参数,因此您可以通过传递低值序列作为第一个参数,高值序列作为第二个参数以及size参数来生成所需的样本作为(num, m),其中m是范围数。

例如,

In [23]: num = 5

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

In [25]: np.random.uniform(ranges[:, 0], 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]])