迭代列表找到每个点的标准偏差

时间:2013-07-18 19:51:04

标签: python list loops python-2.x standard-deviation

我有这段代码应该找到A中每个数字的标准差,其中A是由7个值组成的列表列表。

def sigma(A):
    diff = 0
    positives = [b for b in A if b >= 0]
    if positives:
        mean = sum(positives) / len(positives)
        for i in positives:  
            diff = ((sum([abs(i - mean)**2 for i in positives]))/(len(positives)))**(0.5)
            return diff
    else:
        return 0

    G = map(sigma, zip(*A))
    print G

这正确地给出了第一个7个数字列表的标准偏差,但不应该map(sigma, zip(*A))使它迭代所有列表?我也尝试了[sigma(A) for col in xrange(len(rows[0]))],但这也没有用。理想情况下,标准偏差也将保存为七个列表。任何帮助表示赞赏。

更新: 这是我现在的代码;

def sigma(A):
    diff = 0
    positives = [b for b in A if b >= 0]
    if positives:
        mean = sum(positives) / len(positives)
        diff += ((sum([abs(i - mean)**2 for i in positives]))/(len(positives)))**(0.5)
        for i in positives:
            if (abs(i - mean)) > (diff*3):
                return -9999.00
            else:
                return i

    else:
        return -9999.00

G = map(sigma, zip(*A))
print G

它完成了我想要它做的所有事情但是当我以这种方式运行时它只输出第一行。如果将'return'语句替换为'print'并删除print G,则打印所有行所需的输出。如何将所有这些值存储在列表中?我假设这条线G = map(sigma, zip(*A))就是问题所在。我尝试将其更改为G = map(sigma, A)但是这只给了我第一列的数字。 有没有人有任何想法?

1 个答案:

答案 0 :(得分:1)

positives = [b for b in A if b >= 0]没有按照您的想法行事。 b将是7个元素的列表,7个元素的列表如何大于0?

numpy让这很容易:

import numpy as np
import numpy.ma as ma
A = [[-9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0],
    [-9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0],
    [0.040896, 0.018690, 0.005620, -9999.0, 0.038722, 0.018323, -9999.0],
    [0.039443, 0.017517, 0.003460, -9999.0, 0.035526, 0.011692, -9999.0],
    [-9999.0, 0.017963, 0.005264, -9999.0, 0.03788, 0.014316, -9999.0]]
A = np.array(A)

sigmas = []
for b in A:
    bmask=ma.masked_array(b,mask=np.greater_equal(b,0))
    b=b[bmask.mask]
    print b
    sigmas.append(np.std(b))

给出

[]
[]
[ 0.040896  0.01869   0.00562   0.038722  0.018323]
[ 0.039443  0.017517  0.00346   0.035526  0.011692]
[ 0.017963  0.005264  0.03788   0.014316]

>>> sigmas
[0.0, 0.0, 0.013412289355661845, 0.013828802328473713, 0.011917047544903896]

编辑:回复评论

>>> A=[[1,2,3,4,5,6,7],[2,-3,4,-3,2,1,-9]]
>>> [b for b in A if b>=0]
[[1, 2, 3, 4, 5, 6, 7], [2, -3, 4, -3, 2, 1, -9]]

Python没有给你一个错误,但它没有将b中的元素与0进行比较,它只是比较b,它被评估为布尔值。< / p>

在这里你可以清楚地看到发生了什么:

>>> bool(b)
True
>>> True >= 0
True

对于A中的7个数字b的每个列表,您只需执行True >= 0True

edit2 :我是个白痴,现在看到你正在尝试使用地图,我所谈论的问题将会被避免。只需将G = map(sigma, zip(*A))更改为G = map(sigma, A)

即可

edit3::您正在返回i而不是diff。这是代码:

def sigma(A):
    positives = [b for b in A if b >= 0]
    if positives:
        mean = sum(positives) / len(positives)
        diff = ((sum([abs(i - mean)**2 for i in positives]))/(len(positives)))**(0.5)
        for i in positives:
            if (abs(i - mean)) > (diff*3):
                return -9999.00
        return diff
    else:
        return -9999.00

A = [[-9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0],
    [-9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0],
    [0.040896, 0.018690, 0.005620, -9999.0, 0.038722, 0.018323, -9999.0],
    [0.039443, 0.017517, 0.003460, -9999.0, 0.035526, 0.011692, -9999.0],
    [-9999.0, 0.017963, 0.005264, -9999.0, 0.03788, 0.014316, -9999.0]]

G = map(sigma, A)

给出:

>>> G
[-9999.0, -9999.0, 0.013412289355661845, 0.013828802328473713, 0.011917047544903896]

edit4 :澄清问题

def sigma(A):
    positives = [b for b in A if b >= 0]
    sq_err=[]
    if positives:
        mean = sum(positives) / len(positives)
        diff = ((sum([abs(i - mean)**2 for i in positives]))/(len(positives)))**(0.5)
        for i in positives:
            if (abs(i - mean)) > (diff*3):
                sq_err.append(-9999.00)
            else:
                sq_err.append(i)
    else:
        return [-9999.00]
    return sq_err

A = [[-9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0],
    [-9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0],
    [0.040896, 0.018690, 0.005620, -9999.0, 0.038722, 0.018323, -9999.0],
    [0.039443, 0.017517, 0.003460, -9999.0, 0.035526, 0.011692, -9999.0],
    [-9999.0, 0.017963, 0.005264, -9999.0, 0.03788, 0.014316, -9999.0]]

G = map(sigma, A)

给出

>>> G
[[-9999.0], [-9999.0], [0.040896, 0.01869, 0.00562, 0.038722, 0.018323], [0.039443, 0.017517, 0.00346, 0.035526, 0.011692], [0.017963, 0.005264, 0.03788, 0.014316]]