【问题标题】:How to generate bounded random array based on mean and standard deviation of another array?如何根据另一个数组的均值和标准差生成有界随机数组?
【发布时间】:2019-04-18 16:32:46
【问题描述】:

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

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

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 的每一行都包含唯一元素(任何行中都没有重复的元素)。到目前为止,我还没有想到任何方法来实现这一点。

【问题讨论】:

  • 您能否附上X 所包含内容的示例数据?
  • X 包含正整数。
  • 好的。所以Xa_array 都是二维数组。
  • 是的,没错。

标签: python numpy random


【解决方案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. 沿第二个轴计算平均值和标准值。在此之前,如果a_size 不是X 中的行数,我们需要对X 进行切片以将其限制为a_size 行。

  2. 在最初的循环版本中,我们使用random.randint,以均值标准和均值+标准为限制。因此,对于建议的版本,请使用步骤#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]

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

【讨论】:

  • 非常感谢。我一直在寻找这样的东西。你能解释一下最后一行是如何工作的吗?另外,是否有可能确保每行中的所有元素在 a_array 中都是唯一的?
  • 对不起,我忘了问独特的部分。我已将其添加为编辑。是否也可以回答这个问题?
  • 谢谢,这解决了它,除非这个循环可以被删除。
  • 这很棒。惊人的答案!非常感谢
【解决方案2】:

只需删除 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]))

【讨论】:

  • 对不起,我忘了问独特的部分。我已将其添加为编辑。是否也可以回答这个问题?
猜你喜欢
  • 2020-07-30
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 2011-06-25
  • 1970-01-01
  • 2022-11-19
相关资源
最近更新 更多