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
,它被評估爲布爾值。
在這裏你可以看到明確發生了什麼:
>>> 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]]
什麼 「所有列表」?簡短的答案是「是」,但「A」很可能以這種方式進行組織。所以,你需要發佈更多的信息,具體回答「A'看起來像什麼?」和「你會得到什麼錯誤?」 – inspectorG4dget
「但這也沒有效果」。當然,因爲軟件只有一種失敗模式,我們都知道這意味着什麼。 – Marcin
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