【发布时间】:2020-06-09 01:07:12
【问题描述】:
我对 python 还很陌生,并且在随机性方面遇到了一些问题。
我在 Mathematica 中寻找与 RandomChoice 类似的东西。 我创建了一个维度矩阵,比如说 10x3,随机数大于 0。让我们将每行的总和称为 s_i for i=0,...,9
稍后我想以加权概率 s_ij/s_i 为每行选择 3 个元素中的 2 个(不重复) 所以我需要这样的东西,但有加权的概率
n=10
aa=np.random.uniform(1000, 2500, (n,3))
print(aa)
help=[0,1,2]
dd=np.zeros((n,2))
for i in range(n):
cc=random.sample(help,2)
dd[i,0]=aa[i,cc[0]]
dd[i,1]=aa[i,cc[1]]
print(dd)
在这里,速度也是一个重要因素,因为我将在 Montecarlo 方法中使用它(这就是我从 Mathematica 切换到 Python 的原因),我想,上面的代码可以大大改进
提前感谢任何提示/帮助
编辑:我现在有以下内容,它正在工作,但对我来说似乎不是好神
#pre-defined lists
nn=3
aa=np.random.uniform(1000, 2500, (nn,3))
help1=[0,1,2]
help2=aa.sum(axis=1)
#now I create a weigthed prob list and fill it
help3=np.zeros((nn,3))
for i in range(nn):
help3[i,0]=aa[i,0]/help2[i]
help3[i,1]=aa[i,1]/help2[i]
help3[i,2]=aa[i,2]/help2[i]
#every timestep when I have to choose 2 out of 3
help5=np.zeros((nn,2))
for i in range(nn):
#cc=random.sample(help1,2)
help4=np.random.choice(help1, 2, replace=False, p=[help3[i,0], help3[i,1], help3[i,2]])
help5[i,0]=aa[i,cc[0]]
help5[i,1]=aa[i,cc[1]]
print(help5)
【问题讨论】:
-
是否总是三分之二,或者这只是一个例子(也就是说,它可能是五分之一还是六分之四)?
-
RTFM!谷歌搜索 numpy random weighted 立即导致docs.scipy.org/doc/numpy-1.15.0/reference/generated/…。而
np.random.choice确实提供了一个给定大小的样本和给定的概率...... -
@SergeBallesta 不过,这并没有完全解决它。 OP 需要的是一种从 多个 分类分布中采样的方法,每个分类分布具有不同的权重集。您可以在循环中使用该函数(或者甚至是标准的
random.choices),但它不像 NumPy。 -
亲爱的@SergeBallesta 我之前在那个惠普上,并监督了一个事实,那就是有一个加权的概率。我的错!
-
@jdehesa,是的,还有很多工作要做,我目前正在处理很多帮助列表,我会在它运行时添加它。是的,每个重量步骤总是三分之二