Skip to main content
 首页 » 编程设计

python之如何从频率分布表中获取均值和标准差

2025年05月04日14sky-heaven

我有一个元组列表 [(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]))?

我看到一个自定义函数 here ,但如果可能,我想使用标准实现。

请您参考如下方法:

首先,我会像 @user8153 那样将那个困惑的列表更改为两个 numpy 数组:

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

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

data = np.repeat(val, freq) 

并使用 numpy statistical functions在你的 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))