如何根据另一个数组的均值和标准差生成有界随机数组?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何根据另一个数组的均值和标准差生成有界随机数组?相关的知识,希望对你有一定的参考价值。
我有一个包含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的每一行都包含唯一的元素(任何行中都没有重复的元素)。到目前为止,我还没有想到任何方法来实现这一目标。
答案
Partially vectorized
我们可以把它减少到一个循环 -
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)
基本理念:
- 沿第二轴计算平均值和标准值。在此之前,如果
X
不是a_size
中的行数,我们需要切割a_size
以将其限制为X
行。 - 在原始的loopy版本中,我们使用
random.randint
,其中mean-std和mean + std作为限制。因此,对于建议的版本,使用步骤#1中的均值和标准值获得低限和高限。 - 使用带有低值和高值的
np.random.choice(np.arange(l,h),X.shape[0],replace=False)
运行循环,以设置可供选择的值范围,并选择大小为X.shape[0]
的随机值和使用replace=False
的唯一值。
Fully vectorized
我们可以使用1和2中列出的技巧对其进行完全矢量化,以便为我们提供类似以下内容的替换前面列出的循环步骤:
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]
请注意,这将占用更多内存。
另一答案
只需删除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]))
以上是关于如何根据另一个数组的均值和标准差生成有界随机数组?的主要内容,如果未能解决你的问题,请参考以下文章
如何根据随机分布数据计算 C++ 中的样本均值、标准差和方差,并与原始均值和 sigma 进行比较