列表的标准差

我想找出几个(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 列表中第二位数字的平均值和标准差;
第三位数字的平均数和标准数... ; 等)。

404552 次浏览

我将把 A_Rank等放入一个2D 笨蛋阵列,然后使用 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 2.7中,可以使用 NumPy 的 numpy.std()给出 人口标准差

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

下面是一些纯 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

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

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

Std (< your-list > ,Ddof = 1)

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

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

其他的答案包括如何在 python 中充分执行 std dev,但是没有人解释如何执行您所描述的奇怪的遍历。

我假设 A-Z 是全部人口。如果没有看到 来吧关于如何从样本中推断的答案。

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

#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]]

现在你可以简单地从 A-Z 中得到所有 n 个位置的标准差和平均值,如下所示:

#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))

使用 python,这里有一些方法:

import statistics as st


n = int(input())
data = list(map(int, input().split()))

方法1-使用函数

stdev = st.pstdev(data)

方法2: 计算方差并求方差的平方根

variance = st.pvariance(data)
devia = math.sqrt(variance)

方法3: 使用基础数学

mean = sum(data)/n
variance = sum([((x - mean) ** 2) for x in X]) / n
stddev = variance ** 0.5


print("{0:0.1f}".format(stddev))

注:

  • variance计算样本总体的方差
  • pvariance计算整个种群的方差
  • stdevpstdev之间的相似差异