当前位置: 首页 > 面试题库 >

如何在Python中从频率分布表中获得均值和标准差

公沈浪
2023-03-14
问题内容

我有一个元组列表[(val1,freq1),(val2,freq2)....(valn,freqn)]。我需要获得上述数据的集中趋势的度量(均值,中位数)和偏差的度量(方差,均值)。我还想绘制一个值的箱形图。

我看到numpy数组有直接的方法可以从值列表中获取均值/中位数和标准差(或方差)。

numpy(或任何其他知名的库)是否有直接方法可对这种频率分布表进行操作?

另外,以编程方式将上述元组列表扩展为一个列表的最佳方法是什么?(例如,如果freq
dist为[(1,3),(50,2)],则为获取列表[1,1,1,50,50]以使用np.mean([1,1,1, 50,50]))

我在这里看到一个自定义函数,但是如果可能的话,我想使用一个标准的实现


问题答案:

首先,我将杂乱的列表更改为两个numpy数组,就像@ user8153那样:

val, freq = np.array(list_tuples).T

然后,您可以重建数组(使用np.repeat防止循环):

data = np.repeat(val, freq)

并在您的阵列上使用numpy统计函数data

如果这导致内存错误(或者您只是想尽可能提高性能),则还可以使用一些专门构建的函数:

def mean_(val, freq):
    return np.average(val, weights = freq)

def median_(val, freq):
    ord = np.argsort(val)
    cdf = np.cumsum(freq[ord])
    return val[ord][np.searchsorted(cdf, cdf[-1] // 2)]

def mode_(val, freq): #in the strictest sense, assuming unique mode
    return val[np.argmax(freq)]

def var_(val, freq):
    avg = mean_(val, freq)
    dev = freq * (val - avg) ** 2
    return dev.sum() / (freq.sum() - 1)

def std_(val, freq):
    return np.sqrt(var_(val, freq))


 类似资料:
  • 有一个函数,但它就像抽样一样,不是我想要的。

  • 问题内容: 这是Java和基本数学问题的结合。Random.nextGaussian()的文档指出,它是从均值0和标准偏差为1的正态分布中抽样的。如果我想从均值和方差不同的正态分布中抽样,该怎么办? 问题答案: 简短的答案是 例如,此答案在此处给出:http : //www.javamex.com/tutorials/random_numbers/gaussian_distribution_2.s

  • 问题内容: 获得监视器分辨率(最好是在元组中)的最简单方法是什么? python 屏幕 分辨率 问题答案: 在Windows上: 如果使用高分辨率屏幕,请确保你的python解释器为HIGHDPIAWARE。

  • 我统一生成了随机数。现在我想使用高斯(正态分布)生成随机数。我不知道均值和标准差。我看过这篇文章:http://www.johndcook.com/cpp_tr1_random.html#normal,但它需要一个均值和标准差!我也知道Box-Muller变换是常用的。这正确地产生了正态分布的值。但我又不知道均值和标准偏差。请不要刺激。有人能帮忙吗?

  • 假定最小=0.00,最大=1400.00,均值=150.50,标准差=25.00,如何根据这些统计数据产生随机值?根据我的理解,这个图是一个斜图,但是我不太确定它是否是一个对数正态分布。然而,从我目前的理解来看,下面的代码返回的值来自正态分布。

  • 这意味着一个平均值的概率是131%? 给定一个点,如何计算一个值的概率?这可能吗? 加上我的情况: 我理解在连续变量中,任何一点的概率都是0。 但是,我的用户问我100在我的数据中的概率是多少,我如何量化100?