0

我有这段代码应该找到 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)但是这只给了我第一列的数字。有没有人有任何想法?

4

1 回答 1

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 不会给你一个错误,但它不会比较bto中的元素0,它只是比较b,它被评估为布尔值。

在这里,您可以清楚地看到正在发生的事情:

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

对于 A 中的每个 7 个数字列表,b您只是在做True >= 0,总是如此True

编辑2:我是个白痴,现在看到您正在尝试使用地图,而我正在谈论的问题将被避免。只需更改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]

编辑4:澄清的问题

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]]
于 2013-07-18T20:02:43.070 回答