我们说我有正态分布,我想从中抽样1000次,如果值在前20个百分点,我想在计数器上加1。什么是最佳解决方案?
我试图用numpy来解决这个问题,并且无法弄清楚它背后的数学。现在我有这个,但我觉得它可以用数学方法完成:
import numpy as np
s = np.random.normal(0, 1, 1000)
sum([val for val in s if val > np.percentile(s, 80)])
答案 0 :(得分:1)
如果您的分发正常,我会假设您知道mu
和sigma
,否则此问题需要一些额外的后期处理。对于您取出的每个元素,您都会有一定的Z=(X-mu)/sigma
。你的第20个百分位是任何X
Z>0.842
。{/ p>
您可以执行以下操作:
if Z_val(x, mu, sigma) > 0.842: counter+=1
答案 1 :(得分:1)
这是生成的数组(您可以使用均值和标准偏差,它们是默认值):
mu = 0
std = 1
arr = np.random.normal(mu, std, 1000)
这将为您提供前20个百分位中的项目数:
arr[arr > np.percentile(arr, 80)].size
Out[30]: 200
编辑:你的代码也很好。但是你不想总结价值,你想要计算它们。因此,只要val > np.percentile(s, 80)
你想要总结1:
sum([1 for val in s if val > np.percentile(s, 80)])
Out[35]: 200
这会比numpy的方法慢。