如何生成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])
答案 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]])