Python,加权线性空间
有没有人能告诉我,生成一个包含从0到100的值的(numpy)数组的最佳方法是什么?这个数组的值应该按照一个正态分布函数来加权,比如说均值是50,方差是5。也就是说,数组中50的数量要多,而0和100的数量要少(几乎没有)。我觉得这个问题应该不难解决,但我有点卡住了……
我想过用np.linspace,但似乎没有加权的选项。
所以我想说清楚:我并不是想要一个简单的从0到100的正态分布,而是想要一个从0到100的数组,里面中间的值要更密集一些。
谢谢
3 个回答
这段代码是用来处理一些特定的任务的。它可能涉及到一些数据的操作,或者是与用户交互的功能。具体来说,代码块中的内容会根据不同的输入来产生不同的结果。你可以把它想象成一个机器,它根据你给它的指令来完成工作。
在编程中,代码块通常是一个功能的集合,像一个小工具箱,里面装着可以重复使用的工具。这样,当你需要做某件事情时,就可以直接拿出来用,而不需要每次都从头开始写。
如果你对这段代码有兴趣,可以尝试理解它的每一行是怎么工作的,慢慢来,编程就是一个不断学习和实践的过程。
>>> sorted([int(random.gauss(50,5)) for i in range(100)])
[33, 40, 40, 40, 40, 40, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 56, 56, 57, 57, 57, 57, 57, 57, 57, 58, 61]
你可以使用scipy库中的统计分布:
import numpy as np
from scipy import stats
# your distribution:
distribution = stats.norm(loc=50, scale=5)
# percentile point, the range for the inverse cumulative distribution function:
bounds_for_range = distribution.cdf([0, 100])
# Linspace for the inverse cdf:
pp = np.linspace(*bounds_for_range, num=1000)
x = distribution.ppf(pp)
# And just to check that it makes sense you can try:
from matplotlib import pyplot as plt
plt.hist(x)
plt.show()
当然,我承认起点和终点可能不是特别准确,因为在来回计算时会有一些数字上的误差。
理解这一点很重要:你的问题并不是完全可解决的,因为一般来说,有限的离散样本无法完全再现你的分布。
你可以通过问一些简单的问题来轻松理解这一点,比如在[0,1]范围内的3个值,要求它们的分布是均匀的。在这种情况下,结果[0,0,1]和[0,1,1]都是合理的。
不过,你可以大致解决这个问题。如果你要求一个包含count
个元素的数组,元素范围是[0,1,...,N]
,而给定的概率是p=[p0,p1,...,pN]
,并且这些概率是归一化的(也就是说p0+...+pN==1
),那么在你得到的数组中,元素k
的数量c_k
理论上是
c[k] = p[k]*count
但是这些数量现在是浮点数。你需要决定一个方法来“取整”,同时保持它们的总和。这就是你问题的不确定性带来的选择自由。