表python中行的标准偏差

时间:2014-10-09 01:27:15

标签: python arrays

基本上我要做的是计算表格数组中每一行的标准差。我已经尝试了所有可以想象的但却无法让它正确执行。

数组看起来像这样

array = [
[  4,  6,  1, -3,-12],
[  9, 14, -4, 32,  0],
[ 22, -3, 12, -2,  8],
[  4,  4,  4,  4,  4]]

python代码:

from file import array 
for row in array:
mean=sum(row)/len(row)
print("Std Dev=",(sum( (x-mean)**2.0 for x in row ) / float(len(row)) )**0.5)

结果:

Std Dev= 6.368673331236263
Std Dev= 12.6237870704476
Std Dev= 9.28654941299512
Std Dev= 0.0

4 个答案:

答案 0 :(得分:2)

已经有一个包可以做到这一点。获得array的每一行的标准偏差:

In [16]: import numpy as np

In [17]: array = [
[  4,  6,  1, -3,-12],
[  10, 14, -4, 32,  0],
[ 22, -3, 10, -2,  8],
[  3,  4,  4,  4,  2]]

In [18]: np.array(array).std(1)
Out[18]: array([  6.37,  12.61,   9.12,   0.8 ])

顺便说一句,如果我们使用np.array(array).std(0),我们就会得到每列的标准偏差。

没有numpy

使用Python3并且没有导入的模块:

array = [
        [  4,  6,  1, -3,-12],
        [  10, 14, -4, 32,  0],
        [ 22, -3, 10, -2,  8],
        [  3,  4,  4,  4,  2]]
for row in array:
    mean=sum(row)/len(row)
    print("Std Dev=",(sum( (x-mean)**2.0 for x in row ) / float(len(row)) )**0.5)

这会产生输出:

Std Dev= 6.368673331236263
Std Dev= 12.611106216347558
Std Dev= 9.121403400793104
Std Dev= 0.8

替代公式

根据具体情况,标准差的公式可能在分母中有nn-1,其中n是数据点的数量。上面的计算使用n。使用n-1的解决方案如下:

array = [
        [  4,  6,  1, -3,-12],
        [  9, 14, -4, 32,  0],
        [ 22, -3, 12, -2,  8],
        [  4,  4,  4,  4,  4]]
for row in array:
    mean=sum(row)/len(row)
    print("Std Dev=",(sum( (x-mean)**2.0 for x in row ) / float(len(row)-1) )**0.5)

这会产生结果:

Std Dev= 7.120393247567159
Std Dev= 14.11382301150188
Std Dev= 10.382677881933928
Std Dev= 0.0

答案 1 :(得分:0)

所以,问题实际上是你没有按照你的意愿行事。看看你的mean()方法;你正在迭代数组。该数组的每个元素是什么? 一个数组本身。但是,作为函数的结果,您将返回第一个内部数组的平均值,因此您将获得表的一行的“平均值”,而不是基于行的长度而是表中的行数

尽管Python是动态类型的,但请尝试根据一系列转换来考虑您的代码。例如,mean()方法(可能)是一个获取列表列表并返回单个整数作为整个表的值的方法。

答案 2 :(得分:0)

您的数组实际上是一个列表列表,因此您需要对其进行双重迭代。对于简单的2D情况,这将起作用:

import math
def total_2D(data):
    return sum(sum(row) for row in data)

def length_2D(data):
    return sum(len(row) for row in data)

def stDev_2D(data):
    length = length_2D(data)
    mean = total_2D(data) / length
    diff_sqr = sum(sum((i - mean) ** 2 for i in row) for row in data)
    return math.sqrt(diff_sqr / length)

data = [[1,2,3],[4,5,6]]
standard = stDev(data)
print(standard)

对于任意数量的维度,您可以更普遍地执行此操作:

import math
def list_total(data):
    if hasattr(data[0], '__iter__'):
        return sum(list_total(item) for item in data)
    else:
        return sum(data)

def list_len(data):
    if hasattr(data[0], '__iter__'):
        return sum(list_len(item) for item in data)
    else:
        return len(data)

def list_diffSqr(data, mean):
    if hasattr(data[0], '__iter__'):
        return sum(list_diffSqr(item, mean) for item in data)
    else:
        return sum((item - mean) ** 2 for item in data)

def list_stDev(data):
    n = list_len(data)
    mean = list_total(data) / n
    return math.sqrt(list_diffSqr(data, mean) / n)

data = [[1,2,3],[4,5,6]]
standard = stDev(data)
print(standard)

请注意,这仅在深度一致时才有效。例如。 [[1,2],[3,4],[5,6]]有效但[[1,2],3,[4,5]]没有。

答案 3 :(得分:0)

让您的生活更轻松,并使用精湛的pandas套餐:

import numpy as np
import pandas as pd

df = pd.DataFrame( [[  4,  6,  1, -3,-12],
                    [  10, 14, -4, 32,  0],
                    [ 22, -3, 10, -2,  8],
                    [  3,  4,  4,  4,  2]], columns=['foo','bar','baz','qux','cor'])    
df['cor'].std()

>>> 8.3864970836060824