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

2024-05-20 22:03:58 发布

您现在位置:Python中文网/ 问答频道 /正文

如何生成一个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])

Tags: 方法代码inimportnumpyforlenas
2条回答

你可以做的是先生成区间[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移动它们,以说明间隔的不同起始值。在

^{}将广播其参数,因此您可以通过传递低值序列作为第一个参数,将高值序列作为第二个参数,并将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]])

相关问题 更多 >