131

我想找到几个(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 列表中第 1 位
的均值和标准;第 2 位的均值和标准来自所有 (A..Z)_rank 列表;
第三位数字的平均值和标准差……;等等)。

4

8 回答 8

183

由于 Python 3.4 / PEP450statistics module在标准库中有一个,它有一个计算stdev你这样的可迭代对象的标准偏差的方法:

>>> A_rank = [0.8, 0.4, 1.2, 3.7, 2.6, 5.8]
>>> import statistics
>>> statistics.stdev(A_rank)
2.0634114147853952
于 2014-02-02T00:27:10.577 回答
116

我会将A_Ranket al 放入一个 2D NumPy数组中,然后使用numpy.mean()andnumpy.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 ])
于 2013-03-13T15:42:16.980 回答
54

这是一些纯 Python 代码,可用于计算平均值和标准差。

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

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
于 2015-01-03T18:48:25.473 回答
22

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

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

numpy.std(<你的列表>, ddof=1 )

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

它计算样本标准而不是总体标准。

于 2015-07-12T09:22:24.173 回答
13

在 python 2.7 中,您可以使用 NumPynumpy.std()给出总体标准差

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

于 2014-04-24T16:15:32.050 回答
13

使用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计算整个总体的方差
  • stdev和之间的相似差异pstdev
于 2019-04-14T06:49:55.573 回答
5

纯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))
于 2017-06-08T14:45:43.070 回答
3

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

我将假设 AZ 是整个人口。如果没有看到Ome关于如何从样本中推断的答案。

因此,要获得每个列表的第一个数字的标准偏差/平均值,您需要这样的东西:

#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 个位置的标准差和平均值:

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

#mean
numpy.mean(getAllNthRanks(n))
于 2017-05-22T16:11:16.873 回答