2013-07-18 29 views
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)但是,這隻能給我第一列的數字。 有沒有人有任何想法?

+0

什麼 「所有列表」?簡短的答案是「是」,但「A」很可能以這種方式進行組織。所以,你需要發佈更多的信息,具體回答「A'看起來像什麼?」和「你會得到什麼錯誤?」 – inspectorG4dget

+0

「但這也沒有效果」。當然,因爲軟件只有一種失敗模式,我們都知道這意味着什麼。 – Marcin

+0

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]]'所以「所有列表」將是5組7個數字。我沒有收到錯誤,我只是沒有收到我想要的所有信息(全部5次迭代)。 – KJo

回答

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不給你一個錯誤,但它不是比較b0中的元素,僅比較b,它被評估爲布爾值。

在這裏你可以看到明確發生了什麼:

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

對於7號b在A的每個列表,你只是在做True >= 0,這始終是True

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]] 
+0

所以我使用'positives = [b for b in A if b> = 0]'給我A的每一行只有正數,它似乎正在工作。另外如果可能的話,我想知道我的代碼有什麼問題,因爲現在它似乎做了我想要的任何事情,但是當我調用函數時,我只得到第一行返回 – KJo

+0

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

+0

print 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.037885,0.014316,-9999.0]]' ,但是當我做打印正片= [0.040896,0.039443] [0.018690,0.017517,0.017963] [0.005620,0.003460,0.005264] [0.038722,0.035526,0.037885] [0.018323,0.011692,0.014316]'嗯? – KJo