列表的标准偏差

我想find几个(Z)列表的第一,第二,…数字的平均值和标准偏差。 例如,我有

A_rank=[0.8,0.4,1.2,3.7,2.6,5.8] B_rank=[0.1,2.8,3.7,2.6,5,3.4] C_Rank=[1.2,3.4,0.5,0.1,2.5,6.1] # etc (up to Z_rank )... 

现在我想取*_Rank[0]的均值和标准, *_Rank[1]的均值和标准等。
(即:所有(A..Z)_rank列表中的第一个数字的平均值和标准差;
所有(A..Z)_rank列表中的第二个数字的平均值和std;
第三位的平均值和标准…; 等等)。

我会把A_Rank等放进一个2D NumPy数组中,然后用numpy.mean()numpy.std()来计算平均值和标准偏差:

 In [17]: import numpy In [18]: arr = numpy.array([A_rank, B_rank, C_rank]) In [20]: numpy.mean(arr, axis=0) Out[20]: array([ 0.7 , 2.2 , 1.8 , 2.13333333, 3.36666667, 5.1 ]) In [21]: numpy.std(arr, axis=0) Out[21]: array([ 0.45460606, 1.29614814, 1.37355985, 1.50628314, 1.15566239, 1.2083046 ]) 

由于Python 3.4 / PEP450在标准库中有一个statistics module ,它有一个方法stdev来计算像你这样的迭代次数的标准偏差:

 >>> A_rank = [0.8, 0.4, 1.2, 3.7, 2.6, 5.8] >>> import statistics >>> statistics.stdev(A_rank) 2.0634114147853952 

这里有一些纯Python代码可以用来计算平均值和标准偏差。

以下所有代码均基于Python 3.4+中的statistics模块。

 def mean(data): """Return the sample arithmetic mean of data.""" n = len(data) if n < 1: raise ValueError('mean requires at least one data point') return sum(data)/n # in Python 2 use sum(data)/float(n) def _ss(data): """Return sum of square deviations of sequence data.""" c = mean(data) ss = sum((xc)**2 for x in data) return ss def stddev(data, ddof=0): """Calculates the population standard deviation by default; specify ddof=1 to compute the sample standard deviation.""" n = len(data) if n < 2: raise ValueError('variance requires at least two data points') ss = _ss(data) pvar = ss/(n-ddof) return pvar**0.5 

注意:为了提高浮点数的精度, statistics模块使用自定义函数_sum而不是我在其中使用的内置sum

现在我们有例如:

 >>> mean([1, 2, 3]) 2.0 >>> stddev([1, 2, 3]) # population standard deviation 0.816496580927726 >>> stddev([1, 2, 3], ddof=1) # sample standard deviation 0.1 

在Python 2.7.1中,您可以使用numpy.std()计算标准偏差:

  • Population std :只需使用numpy.std() ,除了数据列表之外,不需要其他参数。
  • 示例std :您需要将ddof (即Delta自由度)设置为1,如下例所示:

numpy.std(<your-list>, ddof = 1

计算中使用的除数是N – ddof ,其中N表示元素的数量。 默认情况下,ddof为零。

它计算样本标准,而不是人口标准。

在Python 2.7中,你可以使用NumPy的numpy.std()给出总体标准偏差 。

在Python 3.4中, statistics.stdev()返回样本标准偏差。 pstdv()函数与numpy.std()相同。

其他答案涵盖了如何在python中充分执行std dev,但没有人解释如何做你所描述的奇怪的遍历。

我打算假设AZ是整个人口。 如果没有看到梅的回答如何从样本推断。

所以要得到每个列表的第一位数字的标准差/平均值,你需要这样的东西:

 #standard deviation numpy.std([A_rank[0], B_rank[0], C_rank[0], ..., Z_rank[0]]) #mean numpy.mean([A_rank[0], B_rank[0], C_rank[0], ..., Z_rank[0]]) 

为了缩短代码并将其推广到任何第n个数字,请使用为您生成的以下函数:

 def getAllNthRanks(n): return [A_rank[n], B_rank[n], C_rank[n], D_rank[n], E_rank[n], F_rank[n], G_rank[n], H_rank[n], I_rank[n], J_rank[n], K_rank[n], L_rank[n], M_rank[n], N_rank[n], O_rank[n], P_rank[n], Q_rank[n], R_rank[n], S_rank[n], T_rank[n], U_rank[n], V_rank[n], W_rank[n], X_rank[n], Y_rank[n], Z_rank[n]] 

现在你可以简单地得到所有来自AZ的第n个地方的stdd和mean:

 #standard deviation numpy.std(getAllNthRanks(n)) #mean numpy.mean(getAllNthRanks(n)) 

纯Python代码:

 from math import sqrt def stddev(lst): mean = float(sum(lst)) / len(lst) return sqrt(float(reduce(lambda x, y: x + y, map(lambda x: (x - mean) ** 2, lst))) / len(lst))