列表的标准差
我想要计算几个列表中每个位置(比如第1位、第2位……)的平均值和标准差。比如,我有以下这些列表:
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 列表中第1位数字的平均值和标准差;
计算所有 (A..Z)_rank 列表中第2位数字的平均值和标准差;
计算所有 (A..Z)_rank 列表中第3位数字的平均值和标准差……等等。
8 个回答
55
这里有一些纯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((x-c)**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
120
我会把 A_Rank
这些数据放进一个二维的 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 ])
205
从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