列表的标准偏差
我想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))