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
b
Aの 7 つの数字のすべてのリストに対して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]]