我有一个矩阵-
matrix=[[0,0,1,1],[1,2,0,1],[9,0,1,0],[1,1,2,0]]
我想按列取平均值,但我只想在列中包括非零值。 我使用了以下内容-
array= [float(sum(col))/len(col) for col in zip(*matrix)]
但是它在第一列中显示2.75,而应该是1 + 9 + 1/3 = 3.6
答案 0 :(得分:1)
使用numpy:
import numy as np
matrix=np.array([[0,0,1,1],[1,2,0,1],[9,0,1,0],[1,1,2,0]])
array=[np.mean(col[col!=0]) for col in matrix.T]
#array is: [3.6666666666666665, 1.5, 1.3333333333333333, 1.0]
答案 1 :(得分:0)
直接替代您的方法也应该是最快的方法(对于这种大小的问题):
>>> array= [float(sum(col))/sum(map(bool,col)) for col in zip(*matrix)]
>>> array
[3.6666666666666665, 1.5, 1.3333333333333333, 1.0]
编辑:
一种更可靠的方法,处理全零的列:
>>> matrix=[[0,0,1,0],[1,2,0,0],[9,0,1,0],[1,1,2,0]]
>>> array= [float(sum(col))/sum(map(bool,col)) if sum(map(bool,col))>0 else 0 for col in zip(*matrix)]
>>> array
[3.6666666666666665, 1.5, 1.3333333333333333, 0]
答案 2 :(得分:0)
这里是pd.DataFrame().mask
的一种方法:
df = pd.DataFrame(matrix)
df.mask(df.eq(0)).mean()
输出:
0 3.666667
1 1.500000
2 1.333333
3 1.000000
dtype: float64