如何基于另一个数组的均值和标准偏差生成有界随机数组?

时间:2019-04-18 16:32:46

标签: python numpy random

我有一个数组X,其中包含R行和C列。我希望生成一个名为a_array的新数组,其中每个元素将根据其在X中相应行的均值和标准差随机生成。使用Numpy进行此操作的最有效的Python方法是什么?

当前,我正在使用嵌套循环来生成元素级数字。

a_array = np.zeros(shape=(a_size, X.shape[0]))
for i in range(a_size):
    for j in range(X.shape[0]):
        a_array[i][j] = np.random.randint(low=X[i].mean()-X[i].std(), high=X[i].mean()+X[i].std())

编辑:对不起,我忘记了一些东西,但是我还要确保a_array的每一行都包含唯一元素(任何行中都没有重复的元素)。到目前为止,我还没有想过实现此目标的任何方法。

2 个答案:

答案 0 :(得分:1)

只需删除for循环的级别并生成随机数向量即可替换整个行,而不是一次替换位置

a_array = np.zeros(shape=(a_size, X.shape[0]))
for i in range(a_size):
    a_array[i] = np.random.randint(\
                      low=X[i].mean()-X[i].std(),\ 
                      high=X[i].mean()+X[i].std(),\
                      size=(1,a_array.shape[1]))

答案 1 :(得分:1)

部分矢量化

我们可以将其减少到一个循环-

m,s = X[:a_size].mean(1),X[:a_size].std(1)
L = (m-s).astype(int)
H = (m+s).astype(int)
out = np.empty((a_size,X.shape[0]),dtype=int)
for i,(l,h) in enumerate(zip(L,H)):
    out[i] = np.random.choice(np.arange(l,h),X.shape[0],replace=False)

基本思路:

  1. 计算第二个轴上的平均值和std值。在此之前,如果X不是a_size中的行数,我们需要对a_size进行切片以将其限制为X行。

  2. 在原始循环版本中,我们使用random.randint作为均值的均值-std和均值+ std。因此,对于建议的版本,请使用步骤1中的均值和标准差值获得上下限。

  3. 使用np.random.choice(np.arange(l,h),X.shape[0],replace=False)的低值和高值进行循环,以设置值范围以供选择,选择大小为X.shape[0]的随机值,并选择replace=False的唯一值

完全矢量化

我们可以使用12中列出的技巧将其完全矢量化,从而为我们提供类似于以下内容的内容,以代替之前列出的循环步骤:

R = H-L
MX = R.max()
n = X.shape[0]
unqIDs = np.random.rand(len(L),MX).argpartition(axis=1,kth=n)[:,:n]
out = unqIDs%R[:,None] + L[:,None]

请注意,这将占用更多的内存。