2016-03-01 218 views
3

我想從正數和負數混合的列表中找到所有負數的均值。我能找到名單的平均值作爲python的列表名單列表

import numpy as np 

listA = [ [2,3,-7,-4] , [-2,3,4,-5] , [-5,-6,-8,2] , [9,5,13,2] ] 
listofmeans = [np.mean(i) for i in listA ] 

我想創建一個類似的一行代碼,只需要在列表中的負數的平均值。因此,例如新列表的第一個元素是(-7 + -4)/ 2 = -5.5

我的完整列表是:

listofnegativemeans = [ -5.5, -3.5, -6.333333, 0 ] 
+1

最後名單的平均值不爲0,這是不確定的。 – wim

回答

3

您可以使用下列內容:

listA = [[2,3,-7,-4], [-2,3,4,-5], [-5,-6,-8,2], [9,5,13,2]] 
means = [np.mean([el for el in sublist if el < 0] or 0) for sublist in listA] 
print(means) 

輸出

[-5.5, -3.5, -6.3333, 0.0] 

如果沒有元件的我n sublist小於0,列表理解將評估爲[]。通過包含表達式[] or 0我們處理您想要評估空列表的平均值爲0的場景。

+1

當沒有元素不正確時返回零。 – purpletentacle

+0

@ mtk99這是OP要求的!它不直觀,但它是正確的 – gtlambert

0

這將是這樣的:

listA = np.array([ [2,3,-7,-4] , [-2,3,4,-5] , [-5,-6,-8,2] , [9,5,13,2] ]) 

listofnegativemeans = [np.mean(i[i<0]) for i in listA ] 

輸出:

[-5.5, -3.5, -6.333333333333333, nan] 

零是誤導性的,我肯定更喜歡nan如果你沒有那些負面的任何元素。

2

如果你使用numpy,你應該爭取numpythonic代碼而不是回落到Python邏輯。這意味着使用numpy的ndarray數據結構,以及數組的常用索引風格,而不是Python循環。

對於慣用手段:

>>> listA 
[[2, 3, -7, -4], [-2, 3, 4, -5], [-5, -6, -8, 2], [9, 5, 13, 2]] 
>>> A = np.array(listA) 
>>> np.mean(A, axis=1) 
array([-1.5 , 0. , -4.25, 7.25]) 

負數表示:

>>> [np.mean(row[row<0]) for row in A] 
[-5.5, -3.5, -6.333333333333333, nan] 
1

純numpy的方式:

In [2]: np.ma.masked_greater(listA,0).mean(1).data 
Out[2]: array([-5.5  , -3.5  , -6.33333333, 0.  ]) 
+0

是的,我認爲這是最好的方法。忘記了蒙面陣列! – wim